diff --git a/bindings/core/src/method/client.rs b/bindings/core/src/method/client.rs index ab998873fb..a52bccf740 100644 --- a/bindings/core/src/method/client.rs +++ b/bindings/core/src/method/client.rs @@ -44,8 +44,6 @@ pub enum ClientMethod { mana: u64, native_tokens: Option>, account_id: AccountId, - state_index: Option, - state_metadata: Option, foundry_counter: Option, unlock_conditions: Vec, features: Option>, diff --git a/bindings/core/src/method_handler/client.rs b/bindings/core/src/method_handler/client.rs index c59976470f..e64a602027 100644 --- a/bindings/core/src/method_handler/client.rs +++ b/bindings/core/src/method_handler/client.rs @@ -60,8 +60,6 @@ pub(crate) async fn call_client_method_internal(client: &Client, method: ClientM mana, native_tokens, account_id, - state_index, - state_metadata, foundry_counter, unlock_conditions, features, @@ -76,8 +74,6 @@ pub(crate) async fn call_client_method_internal(client: &Client, method: ClientM mana, native_tokens, &account_id, - state_index, - state_metadata.map(prefix_hex::decode).transpose()?, foundry_counter, unlock_conditions, features, diff --git a/bindings/nodejs/examples/client/13-build-account-output.ts b/bindings/nodejs/examples/client/13-build-account-output.ts index a5e021efc0..cca141e88c 100644 --- a/bindings/nodejs/examples/client/13-build-account-output.ts +++ b/bindings/nodejs/examples/client/13-build-account-output.ts @@ -5,12 +5,11 @@ import { Client, initLogger, Utils, - StateControllerAddressUnlockCondition, MetadataFeature, SenderFeature, Ed25519Address, IssuerFeature, - GovernorAddressUnlockCondition, + AddressUnlockCondition, utf8ToHex, } from '@iota/sdk'; require('dotenv').config({ path: '.env' }); @@ -38,14 +37,8 @@ async function run() { const accountOutput = await client.buildAccountOutput({ accountId: '0x0000000000000000000000000000000000000000000000000000000000000000', - stateMetadata: utf8ToHex('hello'), unlockConditions: [ - new StateControllerAddressUnlockCondition( - new Ed25519Address(hexAddress), - ), - new GovernorAddressUnlockCondition( - new Ed25519Address(hexAddress), - ), + new AddressUnlockCondition(new Ed25519Address(hexAddress)), ], features: [ new SenderFeature(new Ed25519Address(hexAddress)), diff --git a/bindings/nodejs/examples/how_tos/account_output/governance-transition.ts b/bindings/nodejs/examples/how_tos/account_output/governance-transition.ts deleted file mode 100644 index bdc046e3bc..0000000000 --- a/bindings/nodejs/examples/how_tos/account_output/governance-transition.ts +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2023 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { - AccountOutput, - StateControllerAddressUnlockCondition, - UnlockConditionType, - Utils, - Wallet, - initLogger, -} from '@iota/sdk'; - -// This example uses secrets in environment variables for simplicity which should not be done in production. -require('dotenv').config({ path: '.env' }); - -// Run with command: -// yarn run-example ./how_tos/account_output/governance-transition.ts - -// In this example we will update the state controller of an account output. -async function run() { - initLogger(); - for (const envVar of [ - 'FAUCET_URL', - 'WALLET_DB_PATH', - 'STRONGHOLD_PASSWORD', - ]) - if (!(envVar in process.env)) { - throw new Error(`.env ${envVar} is undefined, see .env.example`); - } - - try { - // Create the wallet - const wallet = new Wallet({ - storagePath: process.env.WALLET_DB_PATH, - }); - - // Get the account we generated with `01-create-wallet` - const account = await wallet.getAccount('Alice'); - - // May want to ensure the account is synced before sending a transaction. - const balance = await account.sync(); - - if (balance.accounts.length == 0) { - throw new Error(`No account output available in account 'Alice'`); - } - - // We try to update the first account output in the account - const accountId = balance.accounts[0]; - - const accountOutputData = ( - await account.unspentOutputs({ accountIds: [accountId] }) - )[0]; - console.log( - `Account ${accountId} found in unspent output: ${accountOutputData.outputId}`, - ); - - await wallet.setStrongholdPassword( - process.env.STRONGHOLD_PASSWORD as string, - ); - - const newStateController = Utils.parseBech32Address( - (await account.generateEd25519Addresses(1))[0].address, - ); - - const accountOutput = accountOutputData.output as AccountOutput; - const updatedUnlockConditions = accountOutput.unlockConditions.map( - (unlock) => { - if (unlock.type == UnlockConditionType.StateControllerAddress) { - return new StateControllerAddressUnlockCondition( - newStateController, - ); - } else { - return unlock; - } - }, - ); - - const updatedAccountOutput = await ( - await wallet.getClient() - ).buildAccountOutput({ - accountId, - amount: accountOutput.amount, - unlockConditions: updatedUnlockConditions, - stateIndex: accountOutput.stateIndex, - stateMetadata: accountOutput.stateMetadata, - foundryCounter: accountOutput.foundryCounter, - immutableFeatures: accountOutput.immutableFeatures, - features: accountOutput.features, - }); - - console.log('Sending transaction...'); - - const transaction = await account.sendOutputs([updatedAccountOutput]); - console.log(`Transaction sent: ${transaction.transactionId}`); - - // Wait for transaction to get included - const blockId = await account.reissueTransactionUntilIncluded( - transaction.transactionId, - ); - console.log( - `Block included: ${process.env.EXPLORER_URL}/block/${blockId}`, - ); - } catch (error) { - console.log('Error: ', error); - } - process.exit(0); -} - -run(); diff --git a/bindings/nodejs/examples/how_tos/account_output/state-transition.ts b/bindings/nodejs/examples/how_tos/account_output/state-transition.ts deleted file mode 100644 index c57b36dfff..0000000000 --- a/bindings/nodejs/examples/how_tos/account_output/state-transition.ts +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2023 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { AccountOutput, Wallet, initLogger, utf8ToHex } from '@iota/sdk'; - -// This example uses secrets in environment variables for simplicity which should not be done in production. -require('dotenv').config({ path: '.env' }); - -// Run with command: -// yarn run-example ./how_tos/account_output/state-transition.ts - -const NEW_STATE_METADATA = 'updated state metadata 1'; - -// In this example we will update the state metadata of an account output. -async function run() { - initLogger(); - for (const envVar of [ - 'FAUCET_URL', - 'WALLET_DB_PATH', - 'STRONGHOLD_PASSWORD', - ]) - if (!(envVar in process.env)) { - throw new Error(`.env ${envVar} is undefined, see .env.example`); - } - - try { - // Create the wallet - const wallet = new Wallet({ - storagePath: process.env.WALLET_DB_PATH, - }); - - // Get the account we generated with `01-create-wallet` - const account = await wallet.getAccount('Alice'); - - // May want to ensure the account is synced before sending a transaction. - const balance = await account.sync(); - - if (balance.accounts.length == 0) { - throw new Error(`No Alias available in account 'Alice'`); - } - - // We try to update the first account output in the account - const accountId = balance.accounts[0]; - - const accountOutputData = ( - await account.unspentOutputs({ accountIds: [accountId] }) - )[0]; - console.log( - `Alias ${accountId} found in unspent output: ${accountOutputData.outputId}`, - ); - - const accountOutput = accountOutputData.output as AccountOutput; - - const updatedAccountOutput = await ( - await wallet.getClient() - ).buildAccountOutput({ - accountId, - unlockConditions: accountOutput.unlockConditions, - stateIndex: accountOutput.stateIndex + 1, - stateMetadata: utf8ToHex(NEW_STATE_METADATA), - foundryCounter: accountOutput.foundryCounter, - immutableFeatures: accountOutput.immutableFeatures, - features: accountOutput.features, - }); - - await wallet.setStrongholdPassword( - process.env.STRONGHOLD_PASSWORD as string, - ); - - console.log('Sending transaction...'); - - const transaction = await account.sendOutputs([updatedAccountOutput]); - console.log(`Transaction sent: ${transaction.transactionId}`); - - // Wait for transaction to get included - const blockId = await account.reissueTransactionUntilIncluded( - transaction.transactionId, - ); - console.log( - `Block included: ${process.env.EXPLORER_URL}/block/${blockId}`, - ); - } catch (error) { - console.log('Error: ', error); - } - process.exit(0); -} - -run(); diff --git a/bindings/nodejs/examples/how_tos/outputs/features.ts b/bindings/nodejs/examples/how_tos/outputs/features.ts index fa36407e24..f7c8743df8 100644 --- a/bindings/nodejs/examples/how_tos/outputs/features.ts +++ b/bindings/nodejs/examples/how_tos/outputs/features.ts @@ -19,7 +19,7 @@ require('dotenv').config({ path: '.env' }); // Run with command: // yarn run-example ./how_tos/outputs/features.ts -// Build ouputs with all features +// Build outputs with all features async function run() { initLogger(); diff --git a/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts b/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts index e5f4e901ed..d5aa2fd00b 100644 --- a/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts +++ b/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts @@ -12,8 +12,6 @@ import { ExpirationUnlockCondition, TimelockUnlockCondition, SimpleTokenScheme, - StateControllerAddressUnlockCondition, - GovernorAddressUnlockCondition, ImmutableAccountAddressUnlockCondition, AccountAddress, } from '@iota/sdk'; @@ -22,7 +20,7 @@ require('dotenv').config({ path: '.env' }); // Run with command: // yarn run-example ./how_tos/outputs/unlock-conditions.ts -// Build ouputs with all unlock conditions +// Build outputs with all unlock conditions async function run() { initLogger(); @@ -81,20 +79,6 @@ async function run() { ], }); - // Output with governor and state controller unlock condition - const accountOutput = await client.buildAccountOutput({ - accountId: - '0x0000000000000000000000000000000000000000000000000000000000000000', - unlockConditions: [ - new GovernorAddressUnlockCondition( - new Ed25519Address(hexAddress), - ), - new StateControllerAddressUnlockCondition( - new Ed25519Address(hexAddress), - ), - ], - }); - // Output with immutable account unlock condition const foundryOutput = await client.buildFoundryOutput({ serialNumber: 1, @@ -113,7 +97,6 @@ async function run() { basicOutputWithStorageReturn, basicOutputWithTimelock, basicOutputWithExpiration, - accountOutput, foundryOutput, ], null, diff --git a/bindings/nodejs/lib/types/block/output/output.ts b/bindings/nodejs/lib/types/block/output/output.ts index d1d962c215..f7d1b11b03 100644 --- a/bindings/nodejs/lib/types/block/output/output.ts +++ b/bindings/nodejs/lib/types/block/output/output.ts @@ -177,39 +177,15 @@ abstract class ImmutableFeaturesOutput extends CommonOutput { } } -/** - * Base class for state metadata outputs. - */ -abstract class StateMetadataOutput extends ImmutableFeaturesOutput { - readonly stateMetadata?: HexEncodedString; - - /** - * @param type The type of output. - * @param amount The amount of the output. - * @param unlockConditions The unlock conditions for the output. - */ - constructor( - type: OutputType, - amount: u64, - unlockConditions: UnlockCondition[], - ) { - super(type, amount, unlockConditions); - } -} - /** * An Account output. */ -class AccountOutput extends StateMetadataOutput { +class AccountOutput extends ImmutableFeaturesOutput { /** * Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. * Unless its a newly created account, then the id is zeroed. */ readonly accountId: HexEncodedString; - /** - * A counter that must increase by 1 every time the account output is state transitioned. - */ - readonly stateIndex: number; /** * A counter that denotes the number of foundries created by this account output. */ @@ -223,7 +199,6 @@ class AccountOutput extends StateMetadataOutput { * @param amount The amount of the output. * @param mana The amount of stored mana. * @param accountId The account ID as hex-encoded string. - * @param stateIndex A counter that must increase by 1 every time the account output is state transitioned. * @param foundryCounter A counter that denotes the number of foundries created by this account output. * @param unlockConditions The unlock conditions of the output. */ @@ -231,13 +206,11 @@ class AccountOutput extends StateMetadataOutput { amount: u64, mana: u64, accountId: HexEncodedString, - stateIndex: number, foundryCounter: number, unlockConditions: UnlockCondition[], ) { super(OutputType.Account, amount, unlockConditions); this.accountId = accountId; - this.stateIndex = stateIndex; this.foundryCounter = foundryCounter; this.mana = mana; } diff --git a/bindings/nodejs/lib/types/client/output_builder_params/account-output-params.ts b/bindings/nodejs/lib/types/client/output_builder_params/account-output-params.ts index e35bd12822..58f071474d 100644 --- a/bindings/nodejs/lib/types/client/output_builder_params/account-output-params.ts +++ b/bindings/nodejs/lib/types/client/output_builder_params/account-output-params.ts @@ -1,7 +1,7 @@ // Copyright 2021-2023 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountId, Feature, HexEncodedString } from '../..'; +import { AccountId, Feature } from '../..'; import type { BasicOutputBuilderParams } from './basic-output-params'; /** @@ -12,14 +12,6 @@ export interface AccountOutputBuilderParams extends BasicOutputBuilderParams { * Unique identifier of an account, which is the BLAKE2b-256 hash of the Output ID that created it. */ accountId: AccountId; - /** - * A counter that must increase by 1 every time the account output is state transitioned. - */ - stateIndex?: number; - /** - * Metadata that can only be changed by the state controller. - */ - stateMetadata?: HexEncodedString; /** * A counter that denotes the number of foundries created by this account output. */ diff --git a/bindings/nodejs/lib/types/client/query-parameters.ts b/bindings/nodejs/lib/types/client/query-parameters.ts index 9f9220f71d..53023b109b 100644 --- a/bindings/nodejs/lib/types/client/query-parameters.ts +++ b/bindings/nodejs/lib/types/client/query-parameters.ts @@ -29,8 +29,7 @@ export type QueryParameter = /** Query parameters for filtering Account Outputs */ export type AccountQueryParameter = - | StateController - | Governor + | Address | Issuer | Sender | UnlockableByAddress diff --git a/bindings/nodejs/lib/types/wallet/transaction-options.ts b/bindings/nodejs/lib/types/wallet/transaction-options.ts index 818a94b083..eebf1c2e2c 100644 --- a/bindings/nodejs/lib/types/wallet/transaction-options.ts +++ b/bindings/nodejs/lib/types/wallet/transaction-options.ts @@ -102,6 +102,4 @@ export interface AccountOutputParams { immutableMetadata?: HexEncodedString; /** Hex encoded bytes */ metadata?: HexEncodedString; - /** Hex encoded bytes */ - stateMetadata?: HexEncodedString; } diff --git a/bindings/nodejs/tests/client/outputBuilders.spec.ts b/bindings/nodejs/tests/client/outputBuilders.spec.ts index 47fe49cd8e..ef9b7c4879 100644 --- a/bindings/nodejs/tests/client/outputBuilders.spec.ts +++ b/bindings/nodejs/tests/client/outputBuilders.spec.ts @@ -5,7 +5,7 @@ import { describe, it } from '@jest/globals'; import 'reflect-metadata'; import 'dotenv/config'; -import { AddressUnlockCondition, AccountAddress, Client, SecretManager, Ed25519Address, GovernorAddressUnlockCondition, ImmutableAccountAddressUnlockCondition, SimpleTokenScheme, StateControllerAddressUnlockCondition, Utils } from '../../'; +import { AddressUnlockCondition, AccountAddress, Client, SecretManager, Ed25519Address, ImmutableAccountAddressUnlockCondition, SimpleTokenScheme, Utils } from '../../'; import '../customMatchers'; const client = new Client({ @@ -62,10 +62,7 @@ describe.skip('Output builder methods', () => { const accountOutput = await client.buildAccountOutput({ accountId, unlockConditions: [ - new StateControllerAddressUnlockCondition( - new Ed25519Address(hexAddress), - ), - new GovernorAddressUnlockCondition( + new AddressUnlockCondition( new Ed25519Address(hexAddress), ), ], diff --git a/bindings/nodejs/tests/client/utxoMethods.spec.ts b/bindings/nodejs/tests/client/utxoMethods.spec.ts index 0164e5951a..1725585908 100644 --- a/bindings/nodejs/tests/client/utxoMethods.spec.ts +++ b/bindings/nodejs/tests/client/utxoMethods.spec.ts @@ -20,7 +20,7 @@ describe.skip('UTXO methods', () => { it('gets accounts output IDs', async () => { const accountsOutputIds = await client.accountOutputIds([ { - stateController: + address: 'rms1qpllaj0pyveqfkwxmnngz2c488hfdtmfrj3wfkgxtk4gtyrax0jaxzt70zy', }, ]); diff --git a/bindings/nodejs/yarn.lock b/bindings/nodejs/yarn.lock index c6deb85081..a9463d9696 100644 --- a/bindings/nodejs/yarn.lock +++ b/bindings/nodejs/yarn.lock @@ -4,324 +4,324 @@ "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" - resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.10" + "@babel/highlight" "^7.22.13" chalk "^2.4.2" "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-simple-access@^7.22.5": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.22.5": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== +"@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@discoveryjs/json-ext@^0.5.0": version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.6.2" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz" - integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + 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/eslintrc@^2.1.2": version "2.1.2" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" @@ -334,33 +334,33 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.47.0": - version "8.47.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz" - integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== +"@eslint/js@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" + integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -371,112 +371,112 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz" - integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz" - integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^29.6.2" - "@jest/reporters" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.6.2" - jest-haste-map "^29.6.2" - jest-message-util "^29.6.2" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-resolve-dependencies "^29.6.2" - jest-runner "^29.6.2" - jest-runtime "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" - jest-watcher "^29.6.2" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz" - integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.2" + jest-mock "^29.7.0" -"@jest/expect-utils@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz" - integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" -"@jest/expect@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz" - integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^29.6.2" - jest-snapshot "^29.6.2" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz" - integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.6.2" - jest-mock "^29.6.2" - jest-util "^29.6.2" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz" - integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^29.6.2" - "@jest/expect" "^29.6.2" - "@jest/types" "^29.6.1" - jest-mock "^29.6.2" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz" - integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" @@ -485,81 +485,81 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.6.2" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.6.0": - version "29.6.0" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" - integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== +"@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" -"@jest/source-map@^29.6.0": - version "29.6.0" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz" - integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz" - integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz" - integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^29.6.2" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.6.2": - version "29.6.2" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz" - integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.1": - version "29.6.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" - integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.6.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -568,7 +568,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -577,17 +577,17 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.3": version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -595,20 +595,20 @@ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -616,12 +616,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -629,27 +629,27 @@ "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" + integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -658,117 +658,126 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.6" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" + integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" + integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" + integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== dependencies: "@babel/types" "^7.20.7" "@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.3" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz" - integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== + version "8.44.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.6.tgz#60e564551966dd255f4c01c459f0b4fb87068603" + integrity sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== "@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" + integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" + integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" + integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.4.0": - version "29.5.3" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz" - integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== + version "29.5.6" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" + integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== -"@types/node@*", "@types/node@^18.15.12": - version "18.17.5" - resolved "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz" - integrity sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA== +"@types/node@*": + version "20.8.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.9.tgz#646390b4fab269abce59c308fc286dcd818a2b08" + integrity sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg== + dependencies: + undici-types "~5.26.4" + +"@types/node@^18.15.12": + version "18.18.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.7.tgz#bb3a7068dc4ba421b6968f2a259298b3a4e129e8" + integrity sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ== + dependencies: + undici-types "~5.26.4" "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" + integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" + integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" + integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.30.7": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -784,7 +793,7 @@ "@typescript-eslint/parser@^5.30.7": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" @@ -794,7 +803,7 @@ "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" @@ -802,7 +811,7 @@ "@typescript-eslint/type-utils@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" @@ -812,12 +821,12 @@ "@typescript-eslint/types@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" @@ -830,7 +839,7 @@ "@typescript-eslint/utils@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -844,15 +853,20 @@ "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@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== + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" @@ -860,22 +874,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -884,12 +898,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -899,26 +913,26 @@ "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -932,7 +946,7 @@ "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -943,7 +957,7 @@ "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -953,7 +967,7 @@ "@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -965,7 +979,7 @@ "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -973,62 +987,62 @@ "@webpack-cli/configtest@^2.1.1": version "2.1.1" - resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== "@webpack-cli/info@^2.0.2": version "2.0.2" - resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== "@webpack-cli/serve@^2.0.5": version "2.0.5" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abbrev@1: version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== acorn-import-assertions@^1.9.0: version "1.9.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== after@~0.8.1: version "0.8.2" - resolved "https://registry.npmjs.org/after/-/after-0.8.2.tgz" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1038,58 +1052,58 @@ ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-sequence-parser@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi@^0.3.0, ansi@~0.3.0, ansi@~0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" integrity sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A== anymatch@^3.0.3: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1097,12 +1111,12 @@ anymatch@^3.0.3: aproba@^1.0.3: version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.0.0: version "1.0.6" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz#a2d28c93102aa6cc96245a26cb954de06ec53f0c" integrity sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ== dependencies: delegates "^1.0.0" @@ -1110,7 +1124,7 @@ are-we-there-yet@~1.0.0: are-we-there-yet@~1.1.2: version "1.1.7" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== dependencies: delegates "^1.0.0" @@ -1118,19 +1132,19 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-index@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" integrity sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw== dependencies: debug "^2.2.0" @@ -1138,52 +1152,52 @@ array-index@^1.0.0: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -babel-jest@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz" - integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^29.6.2" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1192,10 +1206,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1204,7 +1218,7 @@ babel-plugin-jest-hoist@^29.5.0: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -1220,39 +1234,39 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^29.5.0" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" big-integer@^1.6.17: version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== binary@~0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== dependencies: buffers "~0.1.1" @@ -1260,7 +1274,7 @@ binary@~0.3.0: bl@^4.0.3: version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -1269,24 +1283,24 @@ bl@^4.0.3: bl@~3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f" integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ== dependencies: readable-stream "^3.0.1" bluebird@^3: version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bluebird@~3.4.1: version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1294,65 +1308,65 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.14.5, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^0.1.1: version "0.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof-polyfill@~1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== buffer-shims@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -1360,54 +1374,54 @@ buffer@^5.5.0: buffers@~0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^2.0.1: version "2.1.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001521" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz" - integrity sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ== +caniuse-lite@^1.0.30001541: + version "1.0.30001554" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" + integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== cargo-cp-artifact@^0.1.6: version "0.1.8" - resolved "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz#353814f49f6aa76601a4bcb3ea5f3071180b90de" integrity sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chainsaw@~0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== dependencies: traverse ">=0.3.0 <0.4" chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1416,7 +1430,7 @@ chalk@^2.4.2: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1424,37 +1438,37 @@ chalk@^4.0.0: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== chownr@^1.1.1, chownr@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.2.3" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== class-transformer@^0.5.1: version "0.5.1" - resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== cliui@^3.0.3: version "3.2.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== dependencies: string-width "^1.0.1" @@ -1463,7 +1477,7 @@ cliui@^3.0.3: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -1472,7 +1486,7 @@ cliui@^8.0.1: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -1481,7 +1495,7 @@ clone-deep@^4.0.1: cmake-js@~5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/cmake-js/-/cmake-js-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-5.2.0.tgz#6d72014269a5d23a754a6d170cde9ed2d75eb411" integrity sha512-/HLhzoBEOLKGdE1FLwH5ggzRt67AWTb4IErg4rm+bTC+R0DKUobojDyp17dSswDVPosdoPmHXjKxbJiyBZfQeg== dependencies: bluebird "^3" @@ -1504,100 +1518,113 @@ cmake-js@~5.2.0: co@^4.6.0: version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.14: version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@2.9.x: version "2.9.0" - resolved "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== dependencies: graceful-readlink ">= 1.0.0" commander@^10.0.1: version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^2.20.0, commander@^2.9.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1606,7 +1633,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: d@1, d@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -1614,28 +1641,28 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" debug@^2.2.0: version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decamelize@^1.1.1: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decompress-response@^3.3.0: @@ -1647,90 +1674,90 @@ decompress-response@^3.3.0: dedent@^1.0.0: version "1.5.1" - resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== detect-libc@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +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== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dotenv@^16.0.3: version "16.3.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== duplexer2@~0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" integrity sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g== dependencies: readable-stream "~1.1.9" duplexer2@~0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" each-series-async@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/each-series-async/-/each-series-async-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/each-series-async/-/each-series-async-1.0.1.tgz#7e3f8dfa5af934663960e5a17561362909b34328" integrity sha512-G4zip/Ewpwr6JQxW7+2RNgkPd09h/UNec5UlvA/xKwl4qf5blyBNK6a/zjQc3MojgsxaOb93B9v3T92QU6IMVg== ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -1738,37 +1765,37 @@ ecc-jsbn@~0.1.1: electron-build-env@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/electron-build-env/-/electron-build-env-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/electron-build-env/-/electron-build-env-0.2.0.tgz#5649ee3e5fd006e267086caa945b77a1fa220b92" integrity sha512-L431TbXtXe6iw3ko7ITr/qCu+jumVKLAhCDyhqfab6421LGlawVcT88Ws/DHR57+1lkLN1POQqwNOkjPwQJQmQ== dependencies: commander "^2.9.0" mkdirp "^0.5.1" -electron-to-chromium@^1.4.477: - version "1.4.492" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz" - integrity sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ== +electron-to-chromium@^1.4.535: + version "1.4.566" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.566.tgz#5c5ba1d2dc895f4887043f0cc7e61798c7e5919a" + integrity sha512-mv+fAy27uOmTVlUULy15U3DVJ+jg+8iyKH1bpwboCRhtDC69GKf1PPTZvEIhCyDr81RFqfxZJYrbgp933a1vtg== emittery@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhanced-resolve@^5.15.0: version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -1776,29 +1803,29 @@ enhanced-resolve@^5.15.0: env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: version "7.10.0" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-module-lexer@^1.2.1: version "1.3.1" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" - resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: es6-iterator "^2.0.3" @@ -1807,7 +1834,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" @@ -1816,7 +1843,7 @@ es6-iterator@^2.0.3: es6-symbol@^3.0.2, es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -1824,32 +1851,32 @@ es6-symbol@^3.0.2, es6-symbol@^3.1.1, es6-symbol@^3.1.3: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-prettier@^8.5.0: version "8.10.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -1857,7 +1884,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1865,21 +1892,22 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + 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.20.0: - version "8.47.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz" - integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== + version "8.52.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" + integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "^8.47.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/js" "8.52.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1913,7 +1941,7 @@ eslint@^8.20.0: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1922,46 +1950,46 @@ espree@^9.6.0, espree@^9.6.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.2.0: version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -1976,58 +2004,62 @@ execa@^5.0.0: execspawn@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/execspawn/-/execspawn-1.0.1.tgz#8286f9dde7cecde7905fbdc04e24f368f23f8da6" integrity sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg== dependencies: util-extend "^1.0.1" exit@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^29.0.0, expect@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz" - integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.6.2" - "@types/node" "*" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" ext@^1.1.2: version "1.7.0" - resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: type "^2.7.2" extend@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: version "3.3.1" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -2038,50 +2070,50 @@ fast-glob@^3.2.9: fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastest-levenshtein@^1.0.12: version "1.0.16" - resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2089,33 +2121,39 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -2124,12 +2162,12 @@ form-data@~2.3.2: fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== dependencies: graceful-fs "^4.1.2" @@ -2138,24 +2176,24 @@ fs-extra@^5.0.0: fs-minipass@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: minipass "^2.6.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fstream@^1.0.0, fstream@~1.0.10: version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" @@ -2163,14 +2201,14 @@ fstream@^1.0.0, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gauge@~1.2.0, gauge@~1.2.5: version "1.2.7" - resolved "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" integrity sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA== dependencies: ansi "^0.3.0" @@ -2181,7 +2219,7 @@ gauge@~1.2.0, gauge@~1.2.5: gauge@~2.7.3: version "2.7.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" @@ -2195,34 +2233,34 @@ gauge@~2.7.3: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== getpass@^0.1.1: version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" ghreleases@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/ghreleases/-/ghreleases-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/ghreleases/-/ghreleases-3.0.2.tgz#1bdb6d31ec03a24a0d80f58f5e9a84a4db725818" integrity sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw== dependencies: after "~0.8.1" @@ -2234,14 +2272,14 @@ ghreleases@^3.0.2: ghrepos@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/ghrepos/-/ghrepos-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/ghrepos/-/ghrepos-2.1.0.tgz#abaf558b690b722c70c7ad45076f6f9be8e495e1" integrity sha512-6GM0ohSDTAv7xD6GsKfxJiV/CajoofRyUwu0E8l29d1o6lFAUxmmyMP/FH33afA20ZrXzxxcTtN6TsYvudMoAg== dependencies: ghutils "~3.2.0" ghutils@~3.2.0: version "3.2.6" - resolved "https://registry.npmjs.org/ghutils/-/ghutils-3.2.6.tgz" + resolved "https://registry.yarnpkg.com/ghutils/-/ghutils-3.2.6.tgz#d43986e267da02787464d97a6489659e4609bb1f" integrity sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg== dependencies: jsonist "~2.1.0" @@ -2249,31 +2287,31 @@ ghutils@~3.2.0: github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== "glob@3 || 4 || 5 || 6 || 7", glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2285,7 +2323,7 @@ glob-to-regexp@^0.4.1: glob@5.0.x: version "5.0.15" - resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" @@ -2296,19 +2334,19 @@ glob@5.0.x: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -2320,22 +2358,22 @@ globby@^11.1.0: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== "graceful-readlink@>= 1.0.0": version "1.0.1" - resolved "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== handlebars@^4.7.7: version "4.7.8" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" @@ -2347,12 +2385,12 @@ handlebars@^4.7.7: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -2360,34 +2398,34 @@ har-validator@~5.1.3: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-unicode@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -2396,12 +2434,12 @@ http-signature@~1.2.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== hyperquest@~2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/hyperquest/-/hyperquest-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/hyperquest/-/hyperquest-2.1.3.tgz#523127d7a343181b40bf324e231d2576edf52633" integrity sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw== dependencies: buffer-from "^0.1.1" @@ -2410,17 +2448,17 @@ hyperquest@~2.1.3: ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -2428,7 +2466,7 @@ import-fresh@^3.2.1: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -2436,12 +2474,12 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2449,130 +2487,130 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== interpret@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== invert-kv@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + 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== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-iojs@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-iojs/-/is-iojs-1.1.0.tgz#4c11033b5d5d94d6eab3775dedc9be7d008325f1" integrity sha512-tLn1j3wYSL6DkvEI+V/j0pKohpa5jk+ER74v6S4SgCXnjS0WA+DoZbwZBrrhgwksMvtuwndyGeG5F8YMsoBzSA== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== isarray@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -2581,9 +2619,20 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -2592,7 +2641,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -2601,387 +2650,387 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.6" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz" - integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^29.6.2" - "@jest/expect" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.6.2" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-runtime "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz" - integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz" - integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.6.2" - "@jest/types" "^29.6.1" - babel-jest "^29.6.2" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.6.2" - jest-environment-node "^29.6.2" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-runner "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz" - integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz" - integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.6.2" - pretty-format "^29.6.2" - -jest-environment-node@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz" - integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== - dependencies: - "@jest/environment" "^29.6.2" - "@jest/fake-timers" "^29.6.2" - "@jest/types" "^29.6.1" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.2" - jest-util "^29.6.2" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz" - integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz" - integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^29.5.0, jest-matcher-utils@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz" - integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== +jest-matcher-utils@^29.5.0, jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.6.2" - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz" - integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz" - integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.6.2" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz" - integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.6.2" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz" - integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz" - integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^29.6.2" - "@jest/environment" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.6.2" - jest-haste-map "^29.6.2" - jest-leak-detector "^29.6.2" - jest-message-util "^29.6.2" - jest-resolve "^29.6.2" - jest-runtime "^29.6.2" - jest-util "^29.6.2" - jest-watcher "^29.6.2" - jest-worker "^29.6.2" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz" - integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== - dependencies: - "@jest/environment" "^29.6.2" - "@jest/fake-timers" "^29.6.2" - "@jest/globals" "^29.6.2" - "@jest/source-map" "^29.6.0" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" - jest-message-util "^29.6.2" - jest-mock "^29.6.2" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz" - integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.6.2" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.6.2" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.0.0, jest-util@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz" - integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz" - integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" -jest-watcher@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz" - integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.6.2" + jest-util "^29.7.0" string-length "^4.0.1" jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz" - integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.6.2" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.4.2: - version "29.6.2" - resolved "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz" - integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.6.2" + jest-cli "^29.7.0" js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -2989,66 +3038,71 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.2.2, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonist@~2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/jsonist/-/jsonist-2.1.2.tgz#c1377311e8fc857abe7aa3df197116a911f95324" integrity sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ== dependencies: bl "~3.0.0" @@ -3058,7 +3112,7 @@ jsonist@~2.1.0: jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -3066,31 +3120,38 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== lcid@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== dependencies: invert-kv "^1.0.0" leven@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -3098,131 +3159,131 @@ levn@^0.4.1: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== listenercount@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.memoize@4.x: version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.pad@^4.1.0: version "4.5.1" - resolved "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" integrity sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg== lodash.padend@^4.1.0: version "4.6.1" - resolved "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== lodash.padstart@^4.1.0: version "4.6.1" - resolved "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" integrity sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw== lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lunr@^2.3.9: version "2.3.9" - resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@1.x: version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" marked@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== memory-stream@0: version "0.0.3" - resolved "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz" + resolved "https://registry.yarnpkg.com/memory-stream/-/memory-stream-0.0.3.tgz#ebe8dd1c3b8bc38c0e7941e9ddd5aebe6b4de83f" integrity sha512-q0D3m846qY6ZkIt+19ZemU5vH56lpOZZwoJc3AICARKh/menBuayQUjAGPrqtHQQMUYERSdOrej92J9kz7LgYA== dependencies: readable-stream "~1.0.26-2" merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + 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.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -3230,19 +3291,19 @@ micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0: @@ -3252,26 +3313,26 @@ mimic-response@^1.0.0: "minimatch@2 || 3", minimatch@3, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.0: version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" minimist@^1.1.2, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" @@ -3279,68 +3340,68 @@ minipass@^2.6.0, minipass@^2.9.0: minizlib@^1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: minipass "^2.9.0" mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== node-abi@^3.0.0, node-abi@^3.3.0: - version "3.46.0" - resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.46.0.tgz" - integrity sha512-LXvP3AqTIrtvH/jllXjkNVbYifpRbt9ThTtymSMSuHmhugQLAWr99QQFTm+ZRht9ziUvdGOgB+esme1C6iE6Lg== + version "3.51.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d" + integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA== dependencies: semver "^7.3.5" node-gyp@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== dependencies: env-paths "^2.2.0" @@ -3357,12 +3418,12 @@ node-gyp@^6.0.1: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-ninja@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/node-ninja/-/node-ninja-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/node-ninja/-/node-ninja-1.0.2.tgz#20a09e57b92e2df591993d4bf098ac3e727062b6" integrity sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw== dependencies: fstream "^1.0.0" @@ -3382,24 +3443,24 @@ node-ninja@^1.0.1: node-releases@^2.0.13: version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== noop-logger@^0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== "nopt@2 || 3": version "3.0.6" - resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" nopt@^4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" @@ -3407,26 +3468,26 @@ nopt@^4.0.1: normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-path@^2.0.2: version "2.0.4" - resolved "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== dependencies: which "^1.2.10" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npm-which@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== dependencies: commander "^2.9.0" @@ -3435,7 +3496,7 @@ npm-which@^3.0.1: "npmlog@0 || 1 || 2": version "2.0.4" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" integrity sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ== dependencies: ansi "~0.3.1" @@ -3444,7 +3505,7 @@ npm-which@^3.0.1: "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" @@ -3454,7 +3515,7 @@ npm-which@^3.0.1: npmlog@^1.2.0: version "1.2.1" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-1.2.1.tgz#28e7be619609b53f7ad1dd300a10d64d716268b6" integrity sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ== dependencies: ansi "~0.3.0" @@ -3463,12 +3524,12 @@ npmlog@^1.2.0: number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nw-gyp@^3.6.3: version "3.6.6" - resolved "https://registry.npmjs.org/nw-gyp/-/nw-gyp-3.6.6.tgz" + resolved "https://registry.yarnpkg.com/nw-gyp/-/nw-gyp-3.6.6.tgz#0231d603d09665053ea48843d6888d13a4b92fb1" integrity sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA== dependencies: fstream "^1.0.0" @@ -3487,31 +3548,31 @@ nw-gyp@^3.6.3: oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.1.0: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.9.3: version "0.9.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" @@ -3523,24 +3584,24 @@ optionator@^0.9.3: os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== dependencies: lcid "^1.0.0" os-tmpdir@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@0, osenv@^0.1.4: version "0.1.5" - resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" @@ -3548,47 +3609,47 @@ osenv@0, osenv@^0.1.4: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3598,66 +3659,66 @@ parse-json@^5.2.0: path-array@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" integrity sha512-teWG2rJTJJZi2kINKOsHcdIuHP7jy3D7pAsVgdhxMq8kaL2RnS5sg7YTlrClMVCIItcVbPTPI6eMBEoNxYahLA== dependencies: array-index "^1.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" prebuild-install@^7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== dependencies: detect-libc "^2.0.0" @@ -3675,7 +3736,7 @@ prebuild-install@^7.1.1: prebuild@^11.0.4: version "11.0.4" - resolved "https://registry.npmjs.org/prebuild/-/prebuild-11.0.4.tgz" + resolved "https://registry.yarnpkg.com/prebuild/-/prebuild-11.0.4.tgz#5e4a0659e2b98219ad58808b356c7938b0f9e326" integrity sha512-n23Rzql2m8ldFpwcFyouGUrg9VByEF2IroEZlNvPLiQwTJWucTNxIaZEoyVe2AxPRzQb6Eph2ytObxVWm4FA7Q== dependencies: cmake-js "~5.2.0" @@ -3701,36 +3762,36 @@ prebuild@^11.0.4: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@^2.8.3: version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^29.0.0, pretty-format@^29.6.2: - version "29.6.2" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz" - integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== +pretty-format@^29.0.0, 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== dependencies: - "@jest/schemas" "^29.6.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" process-nextick-args@~1.0.6: version "1.0.7" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.0.1: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -3743,7 +3804,7 @@ psl@^1.1.33: pump@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -3751,17 +3812,17 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== qs@~6.5.2: version "6.5.3" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== querystringify@^2.1.1: @@ -3771,19 +3832,19 @@ querystringify@^2.1.1: queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" rc@^1.0.3, rc@^1.2.7: version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -3793,12 +3854,12 @@ rc@^1.0.3, rc@^1.2.7: react-is@^18.0.0: version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.26-2: version "1.0.34" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" @@ -3806,9 +3867,9 @@ react-is@^18.0.0: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.6: +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.6: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -3819,22 +3880,9 @@ react-is@^18.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.2, readable-stream@~2.1.5: - version "2.1.5" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" - integrity sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw== - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readable-stream@^3.0.1, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3843,7 +3891,7 @@ readable-stream@^3.0.1, readable-stream@^3.1.1, readable-stream@^3.4.0: readable-stream@~1.1.9: version "1.1.14" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" @@ -3851,21 +3899,34 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + integrity sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw== + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + rechoir@^0.8.0: version "0.8.0" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" reflect-metadata@^0.1.13: version "0.1.13" - resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== request@2, request@^2.54.0, request@^2.88.0: version "2.88.2" - resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -3891,7 +3952,7 @@ request@2, request@^2.54.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== requires-port@^1.0.0: @@ -3901,30 +3962,30 @@ requires-port@^1.0.0: resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.20.0: - version "1.22.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -3932,65 +3993,65 @@ resolve@^1.20.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@2, rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rsvp@^3.0.13: version "3.6.2" - resolved "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" run-waterfall@^1.1.6: version "1.1.7" - resolved "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/run-waterfall/-/run-waterfall-1.1.7.tgz#ae368b549b2f5171f86c2924492cab3352a6e9c5" integrity sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ== safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -"semver@2.x || 3.x || 4 || 5", semver@^4.3.3, semver@^5.0.3, semver@^5.7.1, semver@^6.3.0, semver@^6.3.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@~5.3.0: +"semver@2.x || 3.x || 4 || 5", semver@^4.3.3, semver@^5.0.3, semver@^5.7.1, semver@^6.3.0, semver@^6.3.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@~5.3.0: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -3999,44 +4060,44 @@ schema-utils@^3.1.1, schema-utils@^3.2.0: serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" set-blocking@~2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setimmediate@~1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shiki@^0.14.1: - version "0.14.3" - resolved "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz" - integrity sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g== + version "0.14.5" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.5.tgz#375dd214e57eccb04f0daf35a32aa615861deb93" + integrity sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw== dependencies: ansi-sequence-parser "^1.1.0" jsonc-parser "^3.2.0" @@ -4045,12 +4106,12 @@ shiki@^0.14.1: signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.8.2, simple-get@^4.0.0: @@ -4064,22 +4125,22 @@ simple-get@^2.8.2, simple-get@^4.0.0: simple-mime@~0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/simple-mime/-/simple-mime-0.1.0.tgz#95f517c4f466d7cff561a71fc9dab2596ea9ef2e" integrity sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4087,14 +4148,14 @@ source-map-support@0.5.13: source-map-support@~0.2.8: version "0.2.10" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" integrity sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ== dependencies: source-map "0.1.32" source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -4102,30 +4163,30 @@ source-map-support@~0.5.20: source-map@0.1.32: version "0.1.32" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" integrity sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ== dependencies: amdefine ">=0.0.4" source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== splitargs@0: version "0.0.7" - resolved "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz" + resolved "https://registry.yarnpkg.com/splitargs/-/splitargs-0.0.7.tgz#fe9f7ae657371b33b10cb80da143cf8249cf6b3b" integrity sha512-UUFYD2oWbNwULH6WoVtLUOw8ch586B+HUqcsAjjjeoBQAM1bD4wZRXu01koaxyd8UeYpybWqW4h+lO1Okv40Tg== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -4139,31 +4200,31 @@ sshpk@^1.7.0: stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" string-length@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^1.0.1, "string-width@^1.0.2 || 2 || 3 || 4": +string-width@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4172,91 +4233,91 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -4266,7 +4327,7 @@ tar-fs@^2.0.0: tar-stream@^2.1.0, tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -4277,7 +4338,7 @@ tar-stream@^2.1.0, tar-stream@^2.1.4: tar@^2.0.0, tar@^4, tar@^4.4.12, tar@^4.4.19: version "4.4.19" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: chownr "^1.1.4" @@ -4290,7 +4351,7 @@ tar@^2.0.0, tar@^4, tar@^4.4.12, tar@^4.4.19: terser-webpack-plugin@^5.3.7: version "5.3.9" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -4300,9 +4361,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.16.8: - version "5.20.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz" - integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== + version "5.22.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -4311,7 +4372,7 @@ terser@^5.16.8: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4320,12 +4381,12 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through2@~0.6.3: version "0.6.5" - resolved "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" integrity sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg== dependencies: readable-stream ">=1.0.33-1 <1.1.0-0" @@ -4333,17 +4394,17 @@ through2@~0.6.3: tmpl@1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" @@ -4360,7 +4421,7 @@ tough-cookie@^4.1.3, tough-cookie@~2.5.0: traceur@0.0.x: version "0.0.111" - resolved "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz" + resolved "https://registry.yarnpkg.com/traceur/-/traceur-0.0.111.tgz#c04de74d14696c3373427de4fc08ecaf913fc3a1" integrity sha512-Zy0NCrl3+k1VZvDrZGQJHjLM4Hwz7XHSedhVTdsbV3RNWVtgw/GUP44Rl5WqqcctLkzyQ60eTU2jxfLrlrjWZQ== dependencies: commander "2.9.x" @@ -4371,12 +4432,12 @@ traceur@0.0.x: "traverse@>=0.3.0 <0.4": version "0.3.9" - resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== ts-jest@^29.0.5: version "29.1.1" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" @@ -4390,70 +4451,70 @@ ts-jest@^29.0.5: tslib@^1.8.1: version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + 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.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type@^1.0.1: version "1.2.0" - resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.7.2: version "2.7.2" - resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== typedoc-plugin-markdown@^3.14.0: - version "3.15.4" - resolved "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.4.tgz" - integrity sha512-KpjFL/NDrQAbY147oIoOgob2vAdEchsMcTVd6+e6H2lC1l5xhi48bhP/fMJI7qYQ8th5nubervgqw51z7gY66A== + version "3.16.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.16.0.tgz#98da250271aafade8b6740a8116a97cd3941abcd" + integrity sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw== dependencies: handlebars "^4.7.7" typedoc@^0.24.6: version "0.24.8" - resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.24.8.tgz#cce9f47ba6a8d52389f5e583716a2b3b4335b63e" integrity sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w== dependencies: lunr "^2.3.9" @@ -4463,17 +4524,22 @@ typedoc@^0.24.6: typescript@^4.9.4: version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== uglify-js@^3.1.4: version "3.17.4" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +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== + universalify@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^0.2.0: @@ -4483,7 +4549,7 @@ universalify@^0.2.0: unzipper@^0.8.13: version "0.8.14" - resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b" integrity sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w== dependencies: big-integer "^1.6.17" @@ -4496,24 +4562,24 @@ unzipper@^0.8.13: readable-stream "~2.1.5" setimmediate "~1.0.4" -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-join@0: version "0.0.1" - resolved "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" integrity sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw== url-parse@^1.5.3: @@ -4526,36 +4592,36 @@ url-parse@^1.5.3: url-template@~2.0.6: version "2.0.8" - resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-extend@^1.0.1: version "1.0.3" - resolved "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== uuid@^3.3.2: version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + version "9.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" + integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" verror@1.10.0: version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -4564,24 +4630,24 @@ verror@1.10.0: vscode-oniguruma@^1.7.0: version "1.7.0" - resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== walker@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -4589,7 +4655,7 @@ watchpack@^2.4.0: webpack-cli@^5.1.4: version "5.1.4" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== dependencies: "@discoveryjs/json-ext" "^0.5.0" @@ -4607,22 +4673,23 @@ webpack-cli@^5.1.4: webpack-merge "^5.7.3" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.88.2: - version "5.88.2" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -4651,33 +4718,33 @@ webpack@^5.88.2: which@1, which@^1.0.9, which@^1.2.10, which@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== window-size@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" integrity sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw== word-wrap@^1.2.4: @@ -4687,12 +4754,12 @@ word-wrap@^1.2.4: wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== dependencies: string-width "^1.0.1" @@ -4700,7 +4767,7 @@ wrap-ansi@^2.0.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4709,12 +4776,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -4722,37 +4789,37 @@ write-file-atomic@^4.0.2: "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.0: version "3.2.2" - resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -4765,7 +4832,7 @@ yargs@^17.3.1: yargs@^3.6.0: version "3.32.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" integrity sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg== dependencies: camelcase "^2.0.1" @@ -4778,5 +4845,5 @@ yargs@^3.6.0: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/bindings/python/examples/client/build_alias.py b/bindings/python/examples/client/build_account.py similarity index 73% rename from bindings/python/examples/client/build_alias.py rename to bindings/python/examples/client/build_account.py index daf4ae7813..95efa4f88d 100644 --- a/bindings/python/examples/client/build_alias.py +++ b/bindings/python/examples/client/build_account.py @@ -3,9 +3,9 @@ from dotenv import load_dotenv -from iota_sdk import (Client, Ed25519Address, GovernorAddressUnlockCondition, +from iota_sdk import (Client, Ed25519Address, AddressUnlockCondition, IssuerFeature, MetadataFeature, SenderFeature, - StateControllerAddressUnlockCondition, Utils, + Utils, utf8_to_hex) load_dotenv() @@ -19,10 +19,8 @@ 'rms1qpllaj0pyveqfkwxmnngz2c488hfdtmfrj3wfkgxtk4gtyrax0jaxzt70zy') account_id = '0x0000000000000000000000000000000000000000000000000000000000000000' -state_metadata = data = utf8_to_hex('Hello, World!') unlock_conditions = [ - StateControllerAddressUnlockCondition(Ed25519Address(hexAddress)), - GovernorAddressUnlockCondition(Ed25519Address(hexAddress)) + AddressUnlockCondition(Ed25519Address(hexAddress)), ] features = [ SenderFeature(Ed25519Address(hexAddress)), @@ -36,7 +34,6 @@ # Build account output account_output = client.build_account_output( account_id=account_id, - state_metadata=state_metadata, unlock_conditions=unlock_conditions, features=features, immutable_features=immutable_features diff --git a/bindings/python/examples/how_tos/account_output/governance_transition.py b/bindings/python/examples/how_tos/account_output/governance_transition.py deleted file mode 100644 index 8e75720044..0000000000 --- a/bindings/python/examples/how_tos/account_output/governance_transition.py +++ /dev/null @@ -1,70 +0,0 @@ -import os - -from dotenv import load_dotenv - -from iota_sdk import Wallet, FilterOptions, Utils, UnlockConditionType, StateControllerAddressUnlockCondition - -load_dotenv() - -# In this example we will update the state controller of an account output. - -for env_var in ['WALLET_DB_PATH', 'STRONGHOLD_PASSWORD', 'EXPLORER_URL']: - if env_var not in os.environ: - raise Exception(f".env {env_var} is undefined, see .env.example") - -wallet = Wallet(os.environ['WALLET_DB_PATH']) - -account = wallet.get_account('Alice') - -# Sync account with the node -balance = account.sync() - -if len(balance.accounts) == 0: - raise Exception("No Account available in account 'Alice'") - -account_id = balance.accounts[0] - -account_output_data = account.unspent_outputs( - FilterOptions(accountIds=[account_id]))[0] -print( - f"Account {account_id} found in unspent output: {account_output_data.outputId}") - -wallet.set_stronghold_password(os.environ["STRONGHOLD_PASSWORD"]) - -print(f"{ account.generate_ed25519_addresses(1)[0].address}") -new_state_controller = Utils.parse_bech32_address( - account.generate_ed25519_addresses(1)[0].address) -print(f"{new_state_controller.__dict__}") - -account_output = account_output_data.output - - -def update_state_controller(unlock_condition): - """ - Replace the address in the StateControllerAddressUnlockCondition - """ - if unlock_condition.type == UnlockConditionType.StateControllerAddress: - return StateControllerAddressUnlockCondition(new_state_controller) - return unlock_condition - - -updated_unlock_conditions = list(map( - update_state_controller, account_output.unlockConditions)) -updated_account_output = wallet.get_client().build_account_output( - account_id, - unlock_conditions=updated_unlock_conditions, - state_index=account_output.stateIndex, - state_metadata=account_output.stateMetadata, - foundry_counter=account_output.foundryCounter, - immutable_features=account_output.immutableFeatures, - features=account_output.features, -) - -print('Sending transaction...') -transaction = account.send_outputs([updated_account_output]) -print(f'Transaction sent: {transaction.transaction_id}') - -# Wait for transaction to get included -blockId = account.reissue_transaction_until_included( - transaction.transaction_id) -print(f'Block included: {os.environ["EXPLORER_URL"]}/block/{blockId}') diff --git a/bindings/python/examples/how_tos/account_output/state_transition.py b/bindings/python/examples/how_tos/account_output/state_transition.py deleted file mode 100644 index a94756fc54..0000000000 --- a/bindings/python/examples/how_tos/account_output/state_transition.py +++ /dev/null @@ -1,59 +0,0 @@ -import os - -from dotenv import load_dotenv - -from iota_sdk import Wallet, FilterOptions, utf8_to_hex - -load_dotenv() - -# In this example we will update the state metadata of an account output. - -NEW_STATE_METADATA = 'updated state metadata 1' - -if 'WALLET_DB_PATH' not in os.environ: - raise Exception(".env WALLET_DB_PATH is undefined, see .env.example") - -if 'STRONGHOLD_PASSWORD' not in os.environ: - raise Exception(".env STRONGHOLD_PASSWORD is undefined, see .env.example") - -if 'EXPLORER_URL' not in os.environ: - raise Exception(".env EXPLORER_URL is undefined, see .env.example") - -wallet = Wallet(os.environ['WALLET_DB_PATH']) - -account = wallet.get_account('Alice') - -# Sync account with the node -balance = account.sync() - -if len(balance.accounts) == 0: - raise Exception("No Account available in account 'Alice'") - -account_id = balance.accounts[0] - -account_output_data = account.unspent_outputs( - FilterOptions(accountIds=[account_id]))[0] -print( - f"Account {account_id} found in unspent output: {account_output_data.outputId}") - -account_output = account_output_data.output -updated_account_output = wallet.get_client().build_account_output( - account_id, - unlock_conditions=account_output.unlock_conditions, - state_index=account_output.state_index + 1, - state_metadata=utf8_to_hex(NEW_STATE_METADATA), - foundry_counter=account_output.foundry_counter, - immutable_features=account_output.immutable_features, - features=account_output.features, -) - -wallet.set_stronghold_password(os.environ["STRONGHOLD_PASSWORD"]) - -print('Sending transaction...') -transaction = account.send_outputs([updated_account_output]) -print(f'Transaction sent: {transaction.transaction_id}') - -# Wait for transaction to get included -blockId = account.reissue_transaction_until_included( - transaction.transaction_id) -print(f'Block included: {os.environ["EXPLORER_URL"]}/block/{blockId}') diff --git a/bindings/python/examples/how_tos/outputs/unlock_conditions.py b/bindings/python/examples/how_tos/outputs/unlock_conditions.py index b64ed9b686..01ee5db20b 100644 --- a/bindings/python/examples/how_tos/outputs/unlock_conditions.py +++ b/bindings/python/examples/how_tos/outputs/unlock_conditions.py @@ -11,8 +11,6 @@ SimpleTokenScheme, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, - GovernorAddressUnlockCondition, - StateControllerAddressUnlockCondition, ImmutableAccountAddressUnlockCondition, ) @@ -71,20 +69,6 @@ ) outputs.append(basic_output) -# Output with governor and state controller unlock condition -account_output = client.build_account_output( - account_id='0x0000000000000000000000000000000000000000000000000000000000000000', - unlock_conditions=[ - GovernorAddressUnlockCondition( - Ed25519Address(hex_address), - ), - StateControllerAddressUnlockCondition( - Ed25519Address(hex_address), - ), - ], -) -outputs.append(account_output) - # Output with immutable account unlock condition foundry_output = client.build_foundry_output( serial_number=1, diff --git a/bindings/python/iota_sdk/client/client.py b/bindings/python/iota_sdk/client/client.py index 69e5224981..79736ad1f8 100644 --- a/bindings/python/iota_sdk/client/client.py +++ b/bindings/python/iota_sdk/client/client.py @@ -155,8 +155,6 @@ def build_account_output(self, amount: Optional[int] = None, mana: Optional[int] = None, native_tokens: Optional[List[NativeToken]] = None, - state_index: Optional[int] = None, - state_metadata: Optional[str] = None, foundry_counter: Optional[int] = None, features: Optional[List[Feature]] = None, immutable_features: Optional[List[Feature]] = None) -> AccountOutput: @@ -168,8 +166,6 @@ def build_account_output(self, amount: The amount of base coins in the new output. mana: Amount of stored Mana held by this output. native_tokens: Native tokens added to the new output. - state_index: A counter that must increase by 1 every time the account is state transitioned. - state_metadata: Metadata that can only be changed by the state controller. foundry_counter: A counter that denotes the number of foundries created by this account output. features: A list of features. immutable_features: A list of immutable features. @@ -203,8 +199,6 @@ def build_account_output(self, 'amount': amount, 'mana': mana, 'nativeTokens': native_tokens, - 'stateIndex': state_index, - 'stateMetadata': state_metadata, 'foundryCounter': foundry_counter, 'features': features, 'immutableFeatures': immutable_features diff --git a/bindings/python/iota_sdk/types/output.py b/bindings/python/iota_sdk/types/output.py index 5876265944..3bf4a93186 100644 --- a/bindings/python/iota_sdk/types/output.py +++ b/bindings/python/iota_sdk/types/output.py @@ -10,7 +10,7 @@ from iota_sdk.types.feature import deserialize_features, SenderFeature, IssuerFeature, MetadataFeature, TagFeature from iota_sdk.types.native_token import NativeToken from iota_sdk.types.token_scheme import SimpleTokenScheme -from iota_sdk.types.unlock_condition import deserialize_unlock_conditions, AddressUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, ExpirationUnlockCondition, StateControllerAddressUnlockCondition, GovernorAddressUnlockCondition, ImmutableAccountAddressUnlockCondition +from iota_sdk.types.unlock_condition import deserialize_unlock_conditions, AddressUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, ExpirationUnlockCondition, ImmutableAccountAddressUnlockCondition class OutputType(IntEnum): @@ -83,10 +83,6 @@ class AccountOutput: The conditions to unlock the output. account_id : The account ID if it's an account output. - state_index : - A counter that must increase by 1 every time the account is state transitioned. - state_metadata : - Metadata that can only be changed by the state controller. foundry_counter : A counter that denotes the number of foundries created by this account output. features : @@ -105,10 +101,8 @@ class AccountOutput: encoder=str )) account_id: HexStr - state_index: int foundry_counter: int - unlock_conditions: List[Union[StateControllerAddressUnlockCondition, - GovernorAddressUnlockCondition]] = field( + unlock_conditions: List[AddressUnlockCondition] = field( metadata=config( decoder=deserialize_unlock_conditions )) @@ -122,7 +116,6 @@ class AccountOutput: metadata=config( decoder=deserialize_features )) - state_metadata: Optional[HexStr] = None native_tokens: Optional[List[NativeToken]] = None type: int = field( default_factory=lambda: int( diff --git a/bindings/python/iota_sdk/types/send_params.py b/bindings/python/iota_sdk/types/send_params.py index b27fe2cd50..81036f1fea 100644 --- a/bindings/python/iota_sdk/types/send_params.py +++ b/bindings/python/iota_sdk/types/send_params.py @@ -111,9 +111,7 @@ class CreateAccountOutputParams(): address: A Bech32 encoded address which will control the account. Default will use the first address of the account. immutable_metadata: Immutable account metadata. metadata: Account metadata. - state_metadata: Account state metadata. """ address: str immutable_metadata: Optional[str] = None metadata: Optional[str] = None - state_metadata: Optional[str] = None diff --git a/bindings/python/tests/test_block.py b/bindings/python/tests/test_block.py index 9dd8ad3eb8..222af92562 100644 --- a/bindings/python/tests/test_block.py +++ b/bindings/python/tests/test_block.py @@ -125,7 +125,7 @@ def test_basic_block_with_tx_payload_all_output_types(): "type": 0, "transactionId": "0x6f23b39ebe433f8b522d2e4360186cd3e6b21baf46c0a591c801161e505330b4", "transactionOutputIndex": 1}, { "type": 0, "transactionId": "0x6f23b39ebe433f8b522d2e4360186cd3e6b21baf46c0a591c801161e505330b4", "transactionOutputIndex": 2}], "inputsCommitment": "0xb6913235037feeeb74ea54ca0354bd7daee95e5a4fc65b67c960e5f0df6a339f", "outputs": [ { - "type": 4, "amount": "1000000", "accountId": "0xf90a577f1bae4587fdb00752a847b3a2a9d623743993e9e7abdd0440a004caee", "stateIndex": 2, "foundryCounter": 1, "unlockConditions": [ + "type": 4, "amount": "1000000", "accountId": "0xf90a577f1bae4587fdb00752a847b3a2a9d623743993e9e7abdd0440a004caee", "foundryCounter": 1, "unlockConditions": [ { "type": 4, "address": { "type": 0, "pubKeyHash": "0x7ffec9e1233204d9c6dce6812b1539ee96af691ca2e4d9065daa85907d33e5d3"}}, { diff --git a/bindings/python/tests/test_output.py b/bindings/python/tests/test_output.py index 7a02f0e278..9964d70b68 100644 --- a/bindings/python/tests/test_output.py +++ b/bindings/python/tests/test_output.py @@ -113,24 +113,15 @@ def test_output(): "mana": "168200", "amount": "168200", "accountId": "0x8d073d15074834785046d9cacec7ac4d672dcb6dad342624a936f3c4334520f1", - "stateIndex": 4, - "stateMetadata": "0x14bd8ce73814dfe5d6f30f65a11bfd6d0b9e5d29c90aff9d71ec4b3d3a2984386a312295fc8b79cd", "foundryCounter": 0, "unlockConditions": [ { - "type": 4, + "type": 0, "address": { "type": 0, "pubKeyHash": "0x1f964c683db3072db2ad26ec4b4bee69fb4224755e65566e284fc2aac057edbc" } }, - { - "type": 5, - "address": { - "type": 0, - "pubKeyHash": "0x1f964c683db3072db2ad26ec4b4bee69fb4224755e65566e284fc2aac057edbc" - } - } ], "features": [ { @@ -150,24 +141,15 @@ def test_output(): "mana": "55100", "amount": "55100", "accountId": "0x5380cce0ac342b8fa3e9c4f46d5b473ee9e824f0017fe43682dca77e6b875354", - "stateIndex": 2, - "stateMetadata": "0x", "foundryCounter": 1, "unlockConditions": [ { - "type": 4, + "type": 0, "address": { "type": 0, "pubKeyHash": "0xc5976c01059227e9246686f138b29d13c3a85efd8a2154729dce23a3dfd52119" } }, - { - "type": 5, - "address": { - "type": 0, - "pubKeyHash": "0xc5976c01059227e9246686f138b29d13c3a85efd8a2154729dce23a3dfd52119" - } - } ], "immutableFeatures": [ { diff --git a/cli/src/command/account.rs b/cli/src/command/account.rs index b692e51048..e3934256d4 100644 --- a/cli/src/command/account.rs +++ b/cli/src/command/account.rs @@ -948,9 +948,11 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), let mut output_ids: &[OutputId] = &[]; let mut amount = 0; let mut native_tokens = NativeTokensBuilder::new(); - let mut nfts = Vec::new(); let mut accounts = Vec::new(); let mut foundries = Vec::new(); + let mut nfts = Vec::new(); + let mut delegations = Vec::new(); + let mut anchors = Vec::new(); if let Some(address) = addresses .iter() @@ -963,20 +965,21 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), // Output might be associated with the address, but can't be unlocked by it, so we check that here. let (required_address, _) = output_data .output - .required_and_unlocked_address(slot_index, output_id, None)?; + .required_and_unlocked_address(slot_index, output_id)?; if address.address().as_ref() == &required_address { if let Some(nts) = output_data.output.native_tokens() { native_tokens.add_native_tokens(nts.clone())?; } match &output_data.output { - Output::Nft(nft) => nfts.push(nft.nft_id_non_null(output_id)), + Output::Basic(_) => {} Output::Account(account) => accounts.push(account.account_id_non_null(output_id)), Output::Foundry(foundry) => foundries.push(foundry.id()), - Output::Basic(_) => {} - Output::Delegation(_) => { - // TODO do we want to log them? + Output::Nft(nft) => nfts.push(nft.nft_id_non_null(output_id)), + Output::Delegation(delegation) => { + delegations.push(delegation.delegation_id_non_null(output_id)) } + Output::Anchor(anchor) => anchors.push(anchor.anchor_id_non_null(output_id)), } let unlock_conditions = output_data .output @@ -994,13 +997,15 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), } log = format!( - "{log}\nOutputs: {:#?}\nBase coin amount: {}\nNative Tokens: {:#?}\nNFTs: {:#?}\nAccounts: {:#?}\nFoundries: {:#?}\n", + "{log}\nOutputs: {:#?}\nBase coin amount: {}\nNative Tokens: {:?}\nAccounts: {:?}\nFoundries: {:?}\nNFTs: {:?}\nDelegations: {:?}\nAnchors: {:?}\n", output_ids, amount, native_tokens.finish_vec()?, - nfts, accounts, foundries, + nfts, + delegations, + anchors ); println_log_info!("{log}"); diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index e0b3d94b03..9937b02621 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -355,16 +355,6 @@ name = "destroy_account_output" path = "examples/how_tos/account/destroy.rs" required-features = ["wallet", "stronghold"] -[[example]] -name = "state_transition" -path = "examples/how_tos/account/state_transition.rs" -required-features = ["wallet", "stronghold"] - -[[example]] -name = "governance_transition" -path = "examples/how_tos/account/governance_transition.rs" -required-features = ["wallet", "stronghold"] - # Outputs [[example]] diff --git a/sdk/examples/client/output/build_account_output.rs b/sdk/examples/client/output/build_account_output.rs index 746b9d015c..3f6631f41a 100644 --- a/sdk/examples/client/output/build_account_output.rs +++ b/sdk/examples/client/output/build_account_output.rs @@ -14,7 +14,7 @@ use iota_sdk::{ address::Address, output::{ feature::{IssuerFeature, MetadataFeature, SenderFeature}, - unlock_condition::{GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition}, + unlock_condition::AddressUnlockCondition, AccountId, AccountOutputBuilder, }, }, @@ -44,13 +44,11 @@ async fn main() -> Result<()> { // Account id needs to be null the first time let account_output = AccountOutputBuilder::new_with_minimum_storage_deposit(rent_structure, AccountId::null()) - .with_state_metadata(metadata) .add_feature(SenderFeature::new(address.clone())) .add_feature(MetadataFeature::new(metadata)?) .add_immutable_feature(IssuerFeature::new(address.clone())) .add_immutable_feature(MetadataFeature::new(metadata)?) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(address.clone())) - .add_unlock_condition(GovernorAddressUnlockCondition::new(address)) + .add_unlock_condition(AddressUnlockCondition::new(address)) .finish_output(token_supply)?; println!("{account_output:#?}"); diff --git a/sdk/examples/how_tos/account/governance_transition.rs b/sdk/examples/how_tos/account/governance_transition.rs deleted file mode 100644 index b8a290cbde..0000000000 --- a/sdk/examples/how_tos/account/governance_transition.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2023 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -//! In this example we will update the state controller of an account output. -//! -//! Make sure that `STRONGHOLD_SNAPSHOT_PATH` and `WALLET_DB_PATH` already exist by -//! running the `./how_tos/accounts_and_addresses/create_account.rs` example! -//! -//! Rename `.env.example` to `.env` first, then run the command: -//! ```sh -//! cargo run --release --all-features --example governance_transition -//! ``` - -use iota_sdk::{ - types::block::output::{ - unlock_condition::StateControllerAddressUnlockCondition, AccountOutputBuilder, UnlockCondition, - }, - wallet::Result, - Wallet, -}; - -#[tokio::main] -async fn main() -> Result<()> { - //  This example uses secrets in environment variables for simplicity which should not be done in production. - dotenvy::dotenv().ok(); - - let wallet = Wallet::builder() - .with_storage_path(&std::env::var("WALLET_DB_PATH").unwrap()) - .finish() - .await?; - let account = wallet.get_account("Alice").await?; - - // Set the stronghold password - wallet - .set_stronghold_password(std::env::var("STRONGHOLD_PASSWORD").unwrap()) - .await?; - - // May want to ensure the account is synced before sending a transaction. - let balance = account.sync(None).await?; - - // Get the first account - let account_id = balance - .accounts() - .first() - .expect("No account output available in the account."); - - let account_output_data = account - .unspent_account_output(account_id) - .await? - .expect("account not found in unspent outputs"); - println!( - "Account '{account_id}' found in unspent output: '{}'", - account_output_data.output_id - ); - - // Generate a new address, which will be the new state controller - let new_state_controller = &account.generate_ed25519_addresses(1, None).await?[0]; - - let token_supply = account.client().get_token_supply().await?; - - let account_output = account_output_data.output.as_account(); - let updated_account_output = AccountOutputBuilder::from(account_output) - .replace_unlock_condition(UnlockCondition::StateControllerAddress( - StateControllerAddressUnlockCondition::new(new_state_controller.address()), - )) - .finish_output(token_supply)?; - - println!("Sending transaction...",); - let transaction = account.send_outputs(vec![updated_account_output], None).await?; - println!("Transaction sent: {}", transaction.transaction_id); - - let block_id = account - .reissue_transaction_until_included(&transaction.transaction_id, None, None) - .await?; - println!( - "Block included: {}/block/{}", - std::env::var("EXPLORER_URL").unwrap(), - block_id - ); - - Ok(()) -} diff --git a/sdk/examples/how_tos/account/state_transition.rs b/sdk/examples/how_tos/account/state_transition.rs deleted file mode 100644 index f17919de50..0000000000 --- a/sdk/examples/how_tos/account/state_transition.rs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2023 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -//! In this example we will update the state metadata of an account output. -//! -//! Make sure that `STRONGHOLD_SNAPSHOT_PATH` and `WALLET_DB_PATH` already exist by -//! running the `./how_tos/accounts_and_addresses/create_account.rs` example! -//! -//! Rename `.env.example` to `.env` first, then run the command: -//! ```sh -//! cargo run --release --all-features --example state_transition -//! ``` - -use iota_sdk::{types::block::output::AccountOutputBuilder, wallet::Result, Wallet}; - -// The metadata for the next state -const NEW_STATE_METADATA: &str = "updated state metadata 1"; - -#[tokio::main] -async fn main() -> Result<()> { - //  This example uses secrets in environment variables for simplicity which should not be done in production. - dotenvy::dotenv().ok(); - - let wallet = Wallet::builder() - .with_storage_path(&std::env::var("WALLET_DB_PATH").unwrap()) - .finish() - .await?; - let account = wallet.get_account("Alice").await?; - - // Set the stronghold password - wallet - .set_stronghold_password(std::env::var("STRONGHOLD_PASSWORD").unwrap()) - .await?; - - // May want to ensure the account is synced before sending a transaction. - let balance = account.sync(None).await?; - - // Get the first account - let account_id = balance - .accounts() - .first() - .expect("No account output available in the account."); - - let account_output_data = account - .unspent_account_output(account_id) - .await? - .expect("account not found in unspent outputs"); - println!( - "Account '{account_id}' found in unspent output: '{}'", - account_output_data.output_id - ); - - let token_supply = account.client().get_token_supply().await?; - let rent_structure = account.client().get_rent_structure().await?; - - let account_output = account_output_data.output.as_account(); - let updated_account_output = AccountOutputBuilder::from(account_output) - // Minimum required storage deposit will change if the new metadata has a different size, so we will update - // the amount - .with_minimum_storage_deposit(rent_structure) - .with_state_metadata(NEW_STATE_METADATA.as_bytes().to_vec()) - .with_state_index(account_output.state_index() + 1) - .finish_output(token_supply)?; - - println!("Sending transaction...",); - let transaction = account.send_outputs(vec![updated_account_output], None).await?; - println!("Transaction sent: {}", transaction.transaction_id); - - let block_id = account - .reissue_transaction_until_included(&transaction.transaction_id, None, None) - .await?; - println!( - "Block included: {}/block/{}", - std::env::var("EXPLORER_URL").unwrap(), - block_id - ); - - Ok(()) -} diff --git a/sdk/examples/how_tos/outputs/unlock_conditions.rs b/sdk/examples/how_tos/outputs/unlock_conditions.rs index d2b3569da4..ae74660100 100644 --- a/sdk/examples/how_tos/outputs/unlock_conditions.rs +++ b/sdk/examples/how_tos/outputs/unlock_conditions.rs @@ -15,11 +15,10 @@ use iota_sdk::{ output::{ dto::OutputDto, unlock_condition::{ - AddressUnlockCondition, ExpirationUnlockCondition, GovernorAddressUnlockCondition, - ImmutableAccountAddressUnlockCondition, StateControllerAddressUnlockCondition, + AddressUnlockCondition, ExpirationUnlockCondition, ImmutableAccountAddressUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, }, - AccountId, AccountOutputBuilder, BasicOutputBuilder, FoundryOutputBuilder, SimpleTokenScheme, TokenScheme, + BasicOutputBuilder, FoundryOutputBuilder, SimpleTokenScheme, TokenScheme, }, }, }; @@ -44,8 +43,6 @@ async fn main() -> Result<()> { let basic_output_builder = BasicOutputBuilder::new_with_minimum_storage_deposit(rent_structure) .add_unlock_condition(AddressUnlockCondition::new(address.clone())); - let account_output_builder = - AccountOutputBuilder::new_with_minimum_storage_deposit(rent_structure, AccountId::null()); let foundry_output_builder = FoundryOutputBuilder::new_with_minimum_storage_deposit(rent_structure, 1, token_scheme); @@ -70,11 +67,6 @@ async fn main() -> Result<()> { basic_output_builder .add_unlock_condition(ExpirationUnlockCondition::new(address.clone(), 1)?) .finish_output(token_supply)?, - // with governor and state controller unlock condition - account_output_builder - .add_unlock_condition(GovernorAddressUnlockCondition::new(address.clone())) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(address)) - .finish_output(token_supply)?, // with immutable account unlock condition foundry_output_builder .add_unlock_condition(ImmutableAccountAddressUnlockCondition::new( diff --git a/sdk/src/client/api/block_builder/input_selection/error.rs b/sdk/src/client/api/block_builder/input_selection/error.rs index 6d462b0c2b..14e3303216 100644 --- a/sdk/src/client/api/block_builder/input_selection/error.rs +++ b/sdk/src/client/api/block_builder/input_selection/error.rs @@ -58,4 +58,8 @@ pub enum Error { /// Unfulfillable requirement. #[error("unfulfillable requirement {0:?}")] UnfulfillableRequirement(Requirement), + /// Unsupported address type. + #[error("unsupported address type {0}")] + // TODO replace with string when 2.0 has Address::kind_str + UnsupportedAddressType(u8), } diff --git a/sdk/src/client/api/block_builder/input_selection/mod.rs b/sdk/src/client/api/block_builder/input_selection/mod.rs index c7feb10aff..445a7cc3cc 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -10,20 +10,18 @@ pub(crate) mod requirement; pub(crate) mod transition; use core::ops::Deref; -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use packable::PackableExt; -pub(crate) use requirement::is_account_transition; pub use self::{burn::Burn, error::Error, requirement::Requirement}; use crate::{ client::{api::types::RemainderData, secret::types::InputSigningData}, types::block::{ - address::{AccountAddress, Address, NftAddress}, + address::{AccountAddress, Address, AnchorAddress, NftAddress}, input::INPUT_COUNT_RANGE, output::{ - AccountOutput, AccountTransition, ChainId, FoundryOutput, NativeTokensBuilder, NftOutput, Output, OutputId, - OUTPUT_COUNT_RANGE, + AccountOutput, ChainId, FoundryOutput, NativeTokensBuilder, NftOutput, Output, OutputId, OUTPUT_COUNT_RANGE, }, payload::signed_transaction::TransactionCapabilities, protocol::ProtocolParameters, @@ -44,7 +42,7 @@ pub struct InputSelection { protocol_parameters: ProtocolParameters, slot_index: SlotIndex, requirements: Vec, - automatically_transitioned: HashMap>, + automatically_transitioned: HashSet, } /// Result of the input selection algorithm. @@ -60,40 +58,24 @@ pub struct Selected { impl InputSelection { fn required_account_nft_addresses(&self, input: &InputSigningData) -> Result, Error> { - let account_transition = - is_account_transition(&input.output, *input.output_id(), &self.outputs, self.burn.as_ref()); let required_address = input .output - .required_and_unlocked_address(self.slot_index, input.output_id(), account_transition)? + .required_and_unlocked_address(self.slot_index, input.output_id())? .0; match required_address { - Address::Ed25519(_) => { - if account_transition.is_some() { - // Only add the requirement if the output is an account because other types of output have been - // filtered by address already. - Ok(Some(Requirement::Ed25519(required_address))) - } else { - Ok(None) - } - } - Address::Account(account_address) => Ok(Some(Requirement::Account( - *account_address.account_id(), - AccountTransition::State, - ))), + Address::Ed25519(_) => Ok(None), + Address::Account(account_address) => Ok(Some(Requirement::Account(*account_address.account_id()))), Address::Nft(nft_address) => Ok(Some(Requirement::Nft(*nft_address.nft_id()))), + Address::Anchor(_) => Err(Error::UnsupportedAddressType(AnchorAddress::KIND)), _ => todo!("What do we do here?"), } } - fn select_input( - &mut self, - input: InputSigningData, - account_transition: Option, - ) -> Result<(), Error> { + fn select_input(&mut self, input: InputSigningData) -> Result<(), Error> { log::debug!("Selecting input {:?}", input.output_id()); - if let Some(output) = self.transition_input(&input, account_transition)? { + if let Some(output) = self.transition_input(&input)? { // No need to check for `outputs_requirements` because // - the sender feature doesn't need to be verified as it has been removed // - the issuer feature doesn't need to be verified as the chain is not new @@ -142,7 +124,7 @@ impl InputSelection { let input = self.available_inputs.swap_remove(index); // Selects required input. - self.select_input(input, None)? + self.select_input(input)? } None => return Err(Error::RequiredInputIsNotAvailable(required_input)), } @@ -191,7 +173,7 @@ impl InputSelection { // TODO may want to make this mandatory at some point slot_index: SlotIndex::from(0), requirements: Vec::new(), - automatically_transitioned: HashMap::new(), + automatically_transitioned: HashSet::new(), } } @@ -227,13 +209,13 @@ impl InputSelection { fn filter_inputs(&mut self) { self.available_inputs.retain(|input| { - // Keep account outputs because at this point we do not know if a state or governor address will be - // required. - if input.output.is_account() { - return true; - } - // Filter out non basic/foundry/nft outputs. - else if !input.output.is_basic() && !input.output.is_foundry() && !input.output.is_nft() { + // TODO what about other kinds? + // Filter out non basic/account/foundry/nft outputs. + if !input.output.is_basic() + && !input.output.is_account() + && !input.output.is_foundry() + && !input.output.is_nft() + { return false; } @@ -247,7 +229,7 @@ impl InputSelection { let required_address = input .output // Account transition is irrelevant here as we keep accounts anyway. - .required_and_unlocked_address(self.slot_index, input.output_id(), None) + .required_and_unlocked_address(self.slot_index, input.output_id()) // PANIC: safe to unwrap as non basic/account/foundry/nft outputs are already filtered out. .unwrap() .0; @@ -259,7 +241,6 @@ impl InputSelection { // Inputs need to be sorted before signing, because the reference unlock conditions can only reference a lower index pub(crate) fn sort_input_signing_data( mut inputs: Vec, - outputs: &[Output], slot_index: SlotIndex, ) -> Result, Error> { // initially sort by output to make it deterministic @@ -269,15 +250,9 @@ impl InputSelection { // filter for ed25519 address first let (mut sorted_inputs, account_nft_address_inputs): (Vec, Vec) = inputs.into_iter().partition(|input_signing_data| { - let account_transition = is_account_transition( - &input_signing_data.output, - *input_signing_data.output_id(), - outputs, - None, - ); let (input_address, _) = input_signing_data .output - .required_and_unlocked_address(slot_index, input_signing_data.output_id(), account_transition) + .required_and_unlocked_address(slot_index, input_signing_data.output_id()) // PANIC: safe to unwrap, because we filtered irrelevant outputs out before .unwrap(); @@ -285,11 +260,9 @@ impl InputSelection { }); for input in account_nft_address_inputs { - let account_transition = is_account_transition(&input.output, *input.output_id(), outputs, None); - let (input_address, _) = - input - .output - .required_and_unlocked_address(slot_index, input.output_id(), account_transition)?; + let (input_address, _) = input + .output + .required_and_unlocked_address(slot_index, input.output_id())?; match sorted_inputs.iter().position(|input_signing_data| match input_address { Address::Account(unlock_address) => { @@ -328,15 +301,9 @@ impl InputSelection { if let Some(account_or_nft_address) = account_or_nft_address { // Check for existing outputs for this address, and insert before match sorted_inputs.iter().position(|input_signing_data| { - let account_transition = is_account_transition( - &input_signing_data.output, - *input_signing_data.output_id(), - outputs, - None, - ); let (input_address, _) = input_signing_data .output - .required_and_unlocked_address(slot_index, input.output_id(), account_transition) + .required_and_unlocked_address(slot_index, input.output_id()) // PANIC: safe to unwrap, because we filtered irrelevant outputs out before .unwrap(); @@ -385,8 +352,8 @@ impl InputSelection { let inputs = self.fulfill_requirement(requirement)?; // Select suggested inputs. - for (input, account_transition) in inputs { - self.select_input(input, account_transition)?; + for input in inputs { + self.select_input(input)?; } } @@ -410,7 +377,7 @@ impl InputSelection { self.validate_transitions()?; Ok(Selected { - inputs: Self::sort_input_signing_data(self.selected_inputs, &self.outputs, self.slot_index)?, + inputs: Self::sort_input_signing_data(self.selected_inputs, self.slot_index)?, outputs: self.outputs, remainder, }) @@ -423,6 +390,7 @@ impl InputSelection { let mut input_chains_foundries = hashbrown::HashMap::new(); let mut input_foundries = Vec::new(); let mut input_nfts = Vec::new(); + for input in &self.selected_inputs { if let Some(native_tokens) = input.output.native_tokens() { input_native_tokens_builder.add_native_tokens(native_tokens.clone())?; @@ -475,15 +443,8 @@ impl InputSelection { &self.outputs, ) { log::debug!("validate_transitions error {err:?}"); - let account_transition = - if account_input.output.as_account().state_index() == account_output.state_index() { - AccountTransition::Governance - } else { - AccountTransition::State - }; return Err(Error::UnfulfillableRequirement(Requirement::Account( *account_output.account_id(), - account_transition, ))); } } diff --git a/sdk/src/client/api/block_builder/input_selection/remainder.rs b/sdk/src/client/api/block_builder/input_selection/remainder.rs index 8601b33349..f9bb877585 100644 --- a/sdk/src/client/api/block_builder/input_selection/remainder.rs +++ b/sdk/src/client/api/block_builder/input_selection/remainder.rs @@ -5,7 +5,6 @@ use crypto::keys::bip44::Bip44; use super::{ requirement::{ - account::is_account_transition, amount::amount_sums, native_tokens::{get_minted_and_melted_native_tokens, get_native_tokens, get_native_tokens_diff}, }, @@ -25,17 +24,9 @@ impl InputSelection { if let Some(remainder_address) = &self.remainder_address { // Search in inputs for the Bip44 chain for the remainder address, so the ledger can regenerate it for input in self.available_inputs.iter().chain(self.selected_inputs.iter()) { - let account_transition = is_account_transition( - &input.output, - *input.output_id(), - self.outputs.as_slice(), - self.burn.as_ref(), - ); - let (required_address, _) = input.output.required_and_unlocked_address( - self.slot_index, - input.output_id(), - account_transition, - )?; + let (required_address, _) = input + .output + .required_and_unlocked_address(self.slot_index, input.output_id())?; if &required_address == remainder_address { return Ok(Some((remainder_address.clone(), input.chain))); @@ -45,15 +36,9 @@ impl InputSelection { } for input in &self.selected_inputs { - let account_transition = is_account_transition( - &input.output, - *input.output_id(), - self.outputs.as_slice(), - self.burn.as_ref(), - ); let required_address = input .output - .required_and_unlocked_address(self.slot_index, input.output_id(), account_transition)? + .required_and_unlocked_address(self.slot_index, input.output_id())? .0; if required_address.is_ed25519() { diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/account.rs b/sdk/src/client/api/block_builder/input_selection/requirement/account.rs index be07ffaf7d..cc1cf01fe9 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/account.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/account.rs @@ -3,39 +3,17 @@ use super::{Error, InputSelection, Requirement}; use crate::{ - client::{api::input_selection::Burn, secret::types::InputSigningData}, - types::block::output::{AccountId, AccountTransition, Output, OutputId}, + client::secret::types::InputSigningData, + types::block::output::{AccountId, Output, OutputId}, }; -pub(crate) fn is_account_transition<'a>( - input: &Output, - input_id: OutputId, - outputs: &[Output], - burn: impl Into>, -) -> Option { - if let Output::Account(account_input) = &input { - let account_id = account_input.account_id_non_null(&input_id); - // Checks if the account exists in the outputs and gets the transition type. - for output in outputs.iter() { - if let Output::Account(account_output) = output { - if *account_output.account_id() == account_id { - if account_output.state_index() == account_input.state_index() { - // Governance transition. - return Some(AccountTransition::Governance); - } else { - // State transition. - return Some(AccountTransition::State); - } - } - } - } - if let Some(burn) = burn.into() { - if burn.accounts().contains(&account_id) { - return Some(AccountTransition::Governance); - } - } +/// Checks if an output is an account with output ID that matches the given account ID. +pub(crate) fn is_account_with_id(output: &Output, account_id: &AccountId, output_id: &OutputId) -> bool { + if let Output::Account(account) = output { + &account.account_id_non_null(output_id) == account_id + } else { + false } - None } /// Checks if an output is an account with a given non null account ID. @@ -48,109 +26,36 @@ pub(crate) fn is_account_with_id_non_null(output: &Output, account_id: &AccountI } } -/// Checks if an output is an account with output ID that matches the given account ID. -pub(crate) fn is_account_with_id(output: &Output, output_id: &OutputId, account_id: &AccountId) -> bool { - if let Output::Account(account) = output { - &account.account_id_non_null(output_id) == account_id - } else { - false - } -} - impl InputSelection { /// Fulfills an account requirement by selecting the appropriate account from the available inputs. pub(crate) fn fulfill_account_requirement( &mut self, account_id: AccountId, - account_transition: AccountTransition, - ) -> Result)>, Error> { - // Check that the account is not burned when a state transition is required. - if account_transition.is_state() - && self - .burn - .as_ref() - .map_or(false, |burn| burn.accounts.contains(&account_id)) - { - return Err(Error::UnfulfillableRequirement(Requirement::Account( - account_id, - account_transition, - ))); - } - - let selected_input = self + ) -> Result, Error> { + // Check if the requirement is already fulfilled. + if let Some(input) = self .selected_inputs .iter() - .find(|input| is_account_with_id(&input.output, input.output_id(), &account_id)); - - // If a state transition is not required and the account has already been selected, no additional check has to - // be performed. - if !account_transition.is_state() && selected_input.is_some() { + .find(|input| is_account_with_id(&input.output, &account_id, input.output_id())) + { log::debug!( - "{account_id:?}/{account_transition:?} requirement already fulfilled by {:?}", - selected_input.unwrap().output_id() + "{account_id:?} requirement already fulfilled by {:?}", + input.output_id() ); return Ok(Vec::new()); } - let available_index = self + // Check if the requirement can be fulfilled. + let index = self .available_inputs .iter() - .position(|input| is_account_with_id(&input.output, input.output_id(), &account_id)); - - // If the account was not already selected and it not available, the requirement can't be fulfilled. - if selected_input.is_none() && available_index.is_none() { - return Err(Error::UnfulfillableRequirement(Requirement::Account( - account_id, - account_transition, - ))); - } - - // If a state transition is not required, we can simply select the account. - if !account_transition.is_state() { - // Remove the output from the available inputs, swap to make it O(1). - let input = self.available_inputs.swap_remove(available_index.unwrap()); - - log::debug!( - "{account_id:?}/{account_transition:?} requirement fulfilled by {:?}", - input.output_id() - ); - - // PANIC: safe to unwrap as it's been checked that it can't be None when a state transition is not required. - return Ok(vec![(input, None)]); - } - - // At this point, a state transition is required so we need to verify that an account output describing a - // governance transition was not provided. - - // PANIC: safe to unwrap as it's been checked that both can't be None at the same time. - let input = selected_input.unwrap_or_else(|| &self.available_inputs[available_index.unwrap()]); - - if is_account_transition(&input.output, *input.output_id(), &self.outputs, self.burn.as_ref()) - == Some(AccountTransition::Governance) - { - return Err(Error::UnfulfillableRequirement(Requirement::Account( - account_id, - account_transition, - ))); - } - - if let Some(available_index) = available_index { - // Remove the output from the available inputs, swap to make it O(1). - let input = self.available_inputs.swap_remove(available_index); - - log::debug!( - "{account_id:?}/{account_transition:?} requirement fulfilled by {:?}", - input.output_id() - ); - - return Ok(vec![(input, None)]); - } + .position(|input| is_account_with_id(&input.output, &account_id, input.output_id())) + .ok_or(Error::UnfulfillableRequirement(Requirement::Account(account_id)))?; + // Remove the input from the available inputs, swap to make it O(1). + let input = self.available_inputs.swap_remove(index); - log::debug!( - "{account_id:?}/{account_transition:?} requirement already fulfilled by {:?}", - selected_input.unwrap().output_id() - ); + log::debug!("{account_id:?} requirement fulfilled by {:?}", input.output_id()); - Ok(Vec::new()) + Ok(vec![input]) } } diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/amount.rs b/sdk/src/client/api/block_builder/input_selection/requirement/amount.rs index 96f31d9162..65daa9618a 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/amount.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/amount.rs @@ -10,8 +10,8 @@ use crate::{ address::Address, input::INPUT_COUNT_MAX, output::{ - unlock_condition::StorageDepositReturnUnlockCondition, AccountOutputBuilder, AccountTransition, - FoundryOutputBuilder, NftOutputBuilder, Output, OutputId, Rent, + unlock_condition::StorageDepositReturnUnlockCondition, AccountOutputBuilder, FoundryOutputBuilder, + NftOutputBuilder, Output, OutputId, Rent, }, slot::SlotIndex, }, @@ -77,7 +77,7 @@ pub(crate) fn amount_sums( #[derive(Debug, Clone)] struct AmountSelection { - newly_selected_inputs: HashMap)>, + newly_selected_inputs: HashMap, inputs_sum: u64, outputs_sum: u64, inputs_sdr: HashMap, @@ -151,8 +151,7 @@ impl AmountSelection { } self.inputs_sum += input.output.amount(); - self.newly_selected_inputs - .insert(*input.output_id(), (input.clone(), None)); + self.newly_selected_inputs.insert(*input.output_id(), input.clone()); if self.missing_amount() == 0 { return true; @@ -162,7 +161,7 @@ impl AmountSelection { false } - fn into_newly_selected_inputs(self) -> Vec<(InputSigningData, Option)> { + fn into_newly_selected_inputs(self) -> Vec { self.newly_selected_inputs.into_values().collect() } } @@ -222,18 +221,12 @@ impl InputSelection { } fn reduce_funds_of_chains(&mut self, amount_selection: &mut AmountSelection) -> Result<(), Error> { - // Only consider automatically transitioned outputs, except for account governance transitions. + // Only consider automatically transitioned outputs. let outputs = self.outputs.iter_mut().filter(|output| { output .chain_id() .as_ref() - .map(|chain_id| { - self.automatically_transitioned - .get(chain_id) - .map_or(false, |account_transition| { - account_transition.map_or(true, |account_transition| account_transition.is_state()) - }) - }) + .map(|chain_id| self.automatically_transitioned.contains(chain_id)) .unwrap_or(false) }); @@ -280,9 +273,7 @@ impl InputSelection { }) } - pub(crate) fn fulfill_amount_requirement( - &mut self, - ) -> Result)>, Error> { + pub(crate) fn fulfill_amount_requirement(&mut self) -> Result, Error> { let mut amount_selection = AmountSelection::new(self)?; if amount_selection.missing_amount() == 0 { @@ -351,7 +342,7 @@ impl InputSelection { fn fulfill_amount_requirement_inner( &mut self, amount_selection: &mut AmountSelection, - ) -> Option)>> { + ) -> Option> { let basic_ed25519_inputs = self.available_inputs.iter().filter(|input| { if let Output::Basic(output) = &input.output { output @@ -389,12 +380,7 @@ impl InputSelection { let mut inputs = self .available_inputs .iter() - .filter(|input| match &input.output { - Output::Basic(_) => false, - // If account, we are only interested in state transitions as governance can't move funds. - Output::Account(account) => self.addresses.contains(account.state_controller_address()), - _ => true, - }) + .filter(|input| !input.output.is_basic()) .peekable(); if inputs.peek().is_some() { diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/ed25519.rs b/sdk/src/client/api/block_builder/input_selection/requirement/ed25519.rs index a3cbb6693a..ce6fb8ee6e 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/ed25519.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/ed25519.rs @@ -1,75 +1,35 @@ // Copyright 2023 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use super::{account::is_account_transition, Error, InputSelection, Requirement}; -use crate::{ - client::secret::types::InputSigningData, - types::block::{address::Address, output::AccountTransition}, -}; +use super::{Error, InputSelection, Requirement}; +use crate::{client::secret::types::InputSigningData, types::block::address::Address}; impl InputSelection { // Checks if a selected input unlocks a given ED25519 address. fn selected_unlocks_ed25519_address(&self, input: &InputSigningData, address: &Address) -> bool { - let account_transition = is_account_transition( - &input.output, - *input.output_id(), - self.outputs.as_slice(), - self.burn.as_ref(), - ); - // PANIC: safe to unwrap as outputs with no address have been filtered out already. let required_address = input .output - .required_and_unlocked_address(self.slot_index, input.output_id(), account_transition) + .required_and_unlocked_address(self.slot_index, input.output_id()) .unwrap() .0; - if account_transition.is_some() { - // Only check if we own the required address if the input is an account because other types of output have - // been filtered by address already. - &required_address == address && self.addresses.contains(address) - } else { - &required_address == address - } + &required_address == address } // Checks if an available input can unlock a given ED25519 address. // In case an account input is selected, also tells if it needs to be state or governance transitioned. - fn available_has_ed25519_address( - &self, - input: &InputSigningData, - address: &Address, - ) -> (bool, Option) { - if input.output.is_account() { - // PANIC: safe to unwrap as outputs without unlock conditions have been filtered out already. - let unlock_conditions = input.output.unlock_conditions().unwrap(); - - // PANIC: safe to unwrap as accounts have a state controller address. - if unlock_conditions.state_controller_address().unwrap().address() == address { - return (self.addresses.contains(address), Some(AccountTransition::State)); - } - - // PANIC: safe to unwrap as accounts have a governor address. - if unlock_conditions.governor_address().unwrap().address() == address { - return (self.addresses.contains(address), Some(AccountTransition::Governance)); - } - - (false, None) - } else { - let (required_address, _) = input - .output - .required_and_unlocked_address(self.slot_index, input.output_id(), None) - .unwrap(); + fn available_has_ed25519_address(&self, input: &InputSigningData, address: &Address) -> bool { + let (required_address, _) = input + .output + .required_and_unlocked_address(self.slot_index, input.output_id()) + .unwrap(); - (&required_address == address, None) - } + &required_address == address } /// Fulfills an ed25519 sender requirement by selecting an available input that unlocks its address. - pub(crate) fn fulfill_ed25519_requirement( - &mut self, - address: &Address, - ) -> Result)>, Error> { + pub(crate) fn fulfill_ed25519_requirement(&mut self, address: &Address) -> Result, Error> { // Checks if the requirement is already fulfilled. if let Some(input) = self .selected_inputs @@ -88,36 +48,24 @@ impl InputSelection { .available_inputs .iter() .enumerate() - .find(|(_, input)| input.output.is_basic() && self.available_has_ed25519_address(input, address).0) + .find(|(_, input)| input.output.is_basic() && self.available_has_ed25519_address(input, address)) { - Some((index, None)) + Some(index) } else { // Otherwise, checks if the requirement can be fulfilled by a non-basic output. self.available_inputs.iter().enumerate().find_map(|(index, input)| { - if !input.output.is_basic() { - if let (true, account_transition) = self.available_has_ed25519_address(input, address) { - Some((index, account_transition)) - } else { - None - } - } else { - None - } + (!input.output.is_basic() && self.available_has_ed25519_address(input, address)).then_some(index) }) }; match found { - Some((index, account_transition)) => { + Some(index) => { // Remove the input from the available inputs, swap to make it O(1). let input = self.available_inputs.swap_remove(index); - log::debug!( - "{address:?} sender requirement fulfilled by {:?} (account transition {:?})", - input.output_id(), - account_transition - ); + log::debug!("{address:?} sender requirement fulfilled by {:?}", input.output_id(),); - Ok(vec![(input, account_transition)]) + Ok(vec![input]) } None => Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address.clone()))), } diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/foundry.rs b/sdk/src/client/api/block_builder/input_selection/requirement/foundry.rs index 8af8f596d0..f1a2f5be1b 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/foundry.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/foundry.rs @@ -4,7 +4,7 @@ use super::{Error, InputSelection, Requirement}; use crate::{ client::secret::types::InputSigningData, - types::block::output::{AccountTransition, FoundryId, Output}, + types::block::output::{FoundryId, Output}, }; /// Checks if an output is a foundry with a given foundry ID. @@ -21,7 +21,7 @@ impl InputSelection { pub(crate) fn fulfill_foundry_requirement( &mut self, foundry_id: FoundryId, - ) -> Result)>, Error> { + ) -> Result, Error> { // Check if the requirement is already fulfilled. if let Some(input) = self .selected_inputs @@ -46,6 +46,6 @@ impl InputSelection { log::debug!("{foundry_id:?} requirement fulfilled by {:?}", input.output_id()); - Ok(vec![(input, None)]) + Ok(vec![input]) } } diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/issuer.rs b/sdk/src/client/api/block_builder/input_selection/requirement/issuer.rs index 696c6f1d6f..99c961c418 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/issuer.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/issuer.rs @@ -2,18 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use super::{Error, InputSelection, Requirement}; -use crate::{ - client::secret::types::InputSigningData, - types::block::{address::Address, output::AccountTransition}, -}; +use crate::{client::secret::types::InputSigningData, types::block::address::Address}; impl InputSelection { /// Fulfills an issuer requirement by fulfilling the equivalent sender requirement. /// Potentially converts the error for a more accurate one. - pub(crate) fn fulfill_issuer_requirement( - &mut self, - address: &Address, - ) -> Result)>, Error> { + pub(crate) fn fulfill_issuer_requirement(&mut self, address: &Address) -> Result, Error> { log::debug!("Treating {address:?} issuer requirement as a sender requirement"); match self.fulfill_sender_requirement(address) { diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/mod.rs b/sdk/src/client/api/block_builder/input_selection/requirement/mod.rs index 2fdd181b6a..599e713b22 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/mod.rs @@ -10,14 +10,13 @@ pub(crate) mod native_tokens; pub(crate) mod nft; pub(crate) mod sender; -pub(crate) use self::account::is_account_transition; use self::{account::is_account_with_id_non_null, foundry::is_foundry_with_id, nft::is_nft_with_id_non_null}; use super::{Error, InputSelection}; use crate::{ client::secret::types::InputSigningData, types::block::{ address::Address, - output::{AccountId, AccountTransition, ChainId, Features, FoundryId, NftId, Output}, + output::{AccountId, ChainId, Features, FoundryId, NftId, Output}, }, }; @@ -32,8 +31,8 @@ pub enum Requirement { Ed25519(Address), /// Foundry requirement. Foundry(FoundryId), - /// Account requirement and whether it needs to be state transitioned (true) or not (false). - Account(AccountId, AccountTransition), + /// Account requirement. + Account(AccountId), /// Nft requirement. Nft(NftId), /// Native tokens requirement. @@ -45,10 +44,7 @@ pub enum Requirement { impl InputSelection { /// Fulfills a requirement by selecting the appropriate available inputs. /// Returns the selected inputs and an optional new requirement. - pub(crate) fn fulfill_requirement( - &mut self, - requirement: Requirement, - ) -> Result)>, Error> { + pub(crate) fn fulfill_requirement(&mut self, requirement: Requirement) -> Result, Error> { log::debug!("Fulfilling requirement {requirement:?}"); match requirement { @@ -56,9 +52,7 @@ impl InputSelection { Requirement::Issuer(address) => self.fulfill_issuer_requirement(&address), Requirement::Ed25519(address) => self.fulfill_ed25519_requirement(&address), Requirement::Foundry(foundry_id) => self.fulfill_foundry_requirement(foundry_id), - Requirement::Account(account_id, account_transition) => { - self.fulfill_account_requirement(account_id, account_transition) - } + Requirement::Account(account_id) => self.fulfill_account_requirement(account_id), Requirement::Nft(nft_id) => self.fulfill_nft_requirement(nft_id), Requirement::NativeTokens => self.fulfill_native_tokens_requirement(), Requirement::Amount => self.fulfill_amount_requirement(), @@ -77,8 +71,7 @@ impl InputSelection { let is_created = account_output.account_id().is_null(); if !is_created { - let requirement = - Requirement::Account(*account_output.account_id(), AccountTransition::Governance); + let requirement = Requirement::Account(*account_output.account_id()); log::debug!("Adding {requirement:?} from output"); self.requirements.push(requirement); } @@ -115,8 +108,7 @@ impl InputSelection { self.requirements.push(requirement); } - let requirement = - Requirement::Account(*foundry_output.account_address().account_id(), AccountTransition::State); + let requirement = Requirement::Account(*foundry_output.account_address().account_id()); log::debug!("Adding {requirement:?} from output"); self.requirements.push(requirement); @@ -155,7 +147,7 @@ impl InputSelection { return Err(Error::BurnAndTransition(ChainId::from(*account_id))); } - let requirement = Requirement::Account(*account_id, AccountTransition::Governance); + let requirement = Requirement::Account(*account_id); log::debug!("Adding {requirement:?} from burn"); self.requirements.push(requirement); } diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/native_tokens.rs b/sdk/src/client/api/block_builder/input_selection/requirement/native_tokens.rs index 1429cf0547..a9871d508e 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/native_tokens.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/native_tokens.rs @@ -8,7 +8,7 @@ use primitive_types::U256; use super::{Error, InputSelection}; use crate::{ client::secret::types::InputSigningData, - types::block::output::{AccountTransition, NativeToken, NativeTokens, NativeTokensBuilder, Output, TokenScheme}, + types::block::output::{NativeToken, NativeTokens, NativeTokensBuilder, Output, TokenScheme}, }; pub(crate) fn get_native_tokens<'a>(outputs: impl Iterator) -> Result { @@ -111,9 +111,7 @@ pub(crate) fn get_native_tokens_diff( } impl InputSelection { - pub(crate) fn fulfill_native_tokens_requirement( - &mut self, - ) -> Result)>, Error> { + pub(crate) fn fulfill_native_tokens_requirement(&mut self) -> Result, Error> { let mut input_native_tokens = get_native_tokens(self.selected_inputs.iter().map(|input| &input.output))?; let mut output_native_tokens = get_native_tokens(self.outputs.iter())?; let (minted_native_tokens, melted_native_tokens) = @@ -155,7 +153,7 @@ impl InputSelection { .amount(); if newly_selected_ids.insert(*input.output_id()) { - newly_selected_inputs.push((input.clone(), None)); + newly_selected_inputs.push(input.clone()); } if amount >= diff.amount() { diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/nft.rs b/sdk/src/client/api/block_builder/input_selection/requirement/nft.rs index fb7605b3ad..0ae00082c3 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/nft.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/nft.rs @@ -4,7 +4,7 @@ use super::{Error, InputSelection, Requirement}; use crate::{ client::secret::types::InputSigningData, - types::block::output::{AccountTransition, NftId, Output, OutputId}, + types::block::output::{NftId, Output, OutputId}, }; /// Checks if an output is an nft with a given nft ID. @@ -31,10 +31,7 @@ pub(crate) fn is_nft_with_id_non_null(output: &Output, nft_id: &NftId) -> bool { impl InputSelection { /// Fulfills an nft requirement by selecting the appropriate nft from the available inputs. - pub(crate) fn fulfill_nft_requirement( - &mut self, - nft_id: NftId, - ) -> Result)>, Error> { + pub(crate) fn fulfill_nft_requirement(&mut self, nft_id: NftId) -> Result, Error> { // Check if the requirement is already fulfilled. if let Some(input) = self .selected_inputs @@ -56,6 +53,6 @@ impl InputSelection { log::debug!("{nft_id:?} requirement fulfilled by {:?}", input.output_id()); - Ok(vec![(input, None)]) + Ok(vec![input]) } } diff --git a/sdk/src/client/api/block_builder/input_selection/requirement/sender.rs b/sdk/src/client/api/block_builder/input_selection/requirement/sender.rs index 3f1954526f..0dfc1fc516 100644 --- a/sdk/src/client/api/block_builder/input_selection/requirement/sender.rs +++ b/sdk/src/client/api/block_builder/input_selection/requirement/sender.rs @@ -2,17 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use super::{Error, InputSelection, Requirement}; -use crate::{ - client::secret::types::InputSigningData, - types::block::{address::Address, output::AccountTransition}, -}; +use crate::{client::secret::types::InputSigningData, types::block::address::Address}; impl InputSelection { /// Fulfills a sender requirement by selecting an available input that unlocks its address. - pub(crate) fn fulfill_sender_requirement( - &mut self, - address: &Address, - ) -> Result)>, Error> { + pub(crate) fn fulfill_sender_requirement(&mut self, address: &Address) -> Result, Error> { match address { Address::Ed25519(_) => { log::debug!("Treating {address:?} sender requirement as an ed25519 requirement"); @@ -29,9 +23,9 @@ impl InputSelection { log::debug!("Treating {address:?} sender requirement as an account requirement"); // A state transition is required to unlock the account address. - match self.fulfill_account_requirement(account_address.into_account_id(), AccountTransition::State) { + match self.fulfill_account_requirement(account_address.into_account_id()) { Ok(res) => Ok(res), - Err(Error::UnfulfillableRequirement(Requirement::Account(_, _))) => { + Err(Error::UnfulfillableRequirement(Requirement::Account(_))) => { Err(Error::UnfulfillableRequirement(Requirement::Sender(address.clone()))) } Err(e) => Err(e), @@ -48,7 +42,7 @@ impl InputSelection { Err(e) => Err(e), } } - _ => todo!("What do we do here?"), + _ => Err(Error::UnsupportedAddressType(address.kind())), } } } diff --git a/sdk/src/client/api/block_builder/input_selection/transition.rs b/sdk/src/client/api/block_builder/input_selection/transition.rs index dd1ae948a1..84213bb246 100644 --- a/sdk/src/client/api/block_builder/input_selection/transition.rs +++ b/sdk/src/client/api/block_builder/input_selection/transition.rs @@ -8,8 +8,8 @@ use super::{ use crate::{ client::secret::types::InputSigningData, types::block::output::{ - AccountOutput, AccountOutputBuilder, AccountTransition, ChainId, FoundryOutput, FoundryOutputBuilder, - NftOutput, NftOutputBuilder, Output, OutputId, + AccountOutput, AccountOutputBuilder, ChainId, FoundryOutput, FoundryOutputBuilder, NftOutput, NftOutputBuilder, + Output, OutputId, }, }; @@ -19,7 +19,6 @@ impl InputSelection { &mut self, input: &AccountOutput, output_id: &OutputId, - account_transition: AccountTransition, ) -> Result, Error> { let account_id = input.account_id_non_null(output_id); @@ -56,21 +55,16 @@ impl InputSelection { // Remove potential sender feature because it will not be needed anymore as it only needs to be verified once. let features = input.features().iter().filter(|feature| !feature.is_sender()).cloned(); - let mut builder = AccountOutputBuilder::from(input) + let builder = AccountOutputBuilder::from(input) .with_account_id(account_id) .with_foundry_counter(u32::max(highest_foundry_serial_number, input.foundry_counter())) .with_features(features); - if account_transition.is_state() { - builder = builder.with_state_index(input.state_index() + 1) - }; - let output = builder.finish_output(self.protocol_parameters.token_supply())?; - self.automatically_transitioned - .insert(ChainId::from(account_id), Some(account_transition)); + self.automatically_transitioned.insert(ChainId::from(account_id)); - log::debug!("Automatic {account_transition} transition of {output_id:?}/{account_id:?}"); + log::debug!("Automatic transition of {output_id:?}/{account_id:?}"); Ok(Some(output)) } @@ -108,7 +102,7 @@ impl InputSelection { .with_features(features) .finish_output(self.protocol_parameters.token_supply())?; - self.automatically_transitioned.insert(ChainId::from(nft_id), None); + self.automatically_transitioned.insert(ChainId::from(nft_id)); log::debug!("Automatic transition of {output_id:?}/{nft_id:?}"); @@ -146,7 +140,7 @@ impl InputSelection { let output = FoundryOutputBuilder::from(input).finish_output(self.protocol_parameters.token_supply())?; - self.automatically_transitioned.insert(ChainId::from(foundry_id), None); + self.automatically_transitioned.insert(ChainId::from(foundry_id)); log::debug!("Automatic transition of {output_id:?}/{foundry_id:?}"); @@ -155,17 +149,9 @@ impl InputSelection { /// Transitions an input by creating a new output if required. /// If no `account_transition` is provided, assumes a state transition. - pub(crate) fn transition_input( - &mut self, - input: &InputSigningData, - account_transition: Option, - ) -> Result, Error> { + pub(crate) fn transition_input(&mut self, input: &InputSigningData) -> Result, Error> { match &input.output { - Output::Account(account_input) => self.transition_account_input( - account_input, - input.output_id(), - account_transition.unwrap_or(AccountTransition::State), - ), + Output::Account(account_input) => self.transition_account_input(account_input, input.output_id()), Output::Nft(nft_input) => self.transition_nft_input(nft_input, input.output_id()), Output::Foundry(foundry_input) => self.transition_foundry_input(foundry_input, input.output_id()), _ => Ok(None), diff --git a/sdk/src/client/node_api/indexer/query_parameters.rs b/sdk/src/client/node_api/indexer/query_parameters.rs index 0ad153d415..665e210d88 100644 --- a/sdk/src/client/node_api/indexer/query_parameters.rs +++ b/sdk/src/client/node_api/indexer/query_parameters.rs @@ -165,10 +165,8 @@ pub struct AccountOutputQueryParameters { sender: Option, /// Filters outputs based on bech32-encoded issuer address. issuer: Option, - /// Filters outputs based on bech32-encoded governor (governance controller) address. - governor: Option, - /// Filters outputs based on bech32-encoded state controller address. - state_controller: Option, + /// Bech32-encoded address that should be searched for. + address: Option, } impl_query_parameters_methods!(AccountOutputQueryParameters); diff --git a/sdk/src/client/node_api/indexer/routes.rs b/sdk/src/client/node_api/indexer/routes.rs index d8355d87ac..3ec73248f6 100644 --- a/sdk/src/client/node_api/indexer/routes.rs +++ b/sdk/src/client/node_api/indexer/routes.rs @@ -47,7 +47,7 @@ impl ClientInner { /// Get account outputs filtered by the given parameters. /// GET with query parameter returns all outputIDs that fit these filter criteria. - /// Query parameters: "stateController", "governor", "issuer", "sender", "createdBefore", "createdAfter" + /// Query parameters: "address", "issuer", "sender", "createdBefore", "createdAfter" /// Returns Err(Node(NotFound) if no results are found. /// api/indexer/v2/outputs/account pub async fn account_output_ids( diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index 79ac2cbcbd..80fff366f7 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -22,16 +22,16 @@ use tokio::sync::Mutex; use super::{GenerateAddressOptions, SecretManage, SecretManagerConfig}; use crate::{ client::secret::{ - is_account_transition, types::{LedgerApp, LedgerDeviceType}, LedgerNanoStatus, PreparedTransactionData, }, types::block::{ - address::{AccountAddress, Address, Ed25519Address, NftAddress}, + address::{AccountAddress, Address, AnchorAddress, Ed25519Address, NftAddress}, output::Output, payload::signed_transaction::SignedTransactionPayload, signature::{Ed25519Signature, Signature}, unlock::{AccountUnlock, NftUnlock, ReferenceUnlock, SignatureUnlock, Unlock, Unlocks}, + Error as BlockError, }, }; @@ -517,29 +517,22 @@ fn merge_unlocks( // Assuming inputs_data is ordered by address type for (current_block_index, input) in prepared_transaction_data.inputs_data.iter().enumerate() { // Get the address that is required to unlock the input - let account_transition = is_account_transition( - &input.output, - *input.output_id(), - prepared_transaction_data.transaction.outputs(), - None, - ); - let (input_address, _) = input.output.required_and_unlocked_address( - slot_index, - input.output_metadata.output_id(), - account_transition, - )?; + let (input_address, _) = input + .output + .required_and_unlocked_address(slot_index, input.output_metadata.output_id())?; // Check if we already added an [Unlock] for this address match block_indexes.get(&input_address) { // If we already have an [Unlock] for this address, add a [Unlock] based on the address type Some(block_index) => match input_address { - Address::Account(_account) => { - merged_unlocks.push(Unlock::Account(AccountUnlock::new(*block_index as u16)?)) - } Address::Ed25519(_ed25519) => { merged_unlocks.push(Unlock::Reference(ReferenceUnlock::new(*block_index as u16)?)); } + Address::Account(_account) => { + merged_unlocks.push(Unlock::Account(AccountUnlock::new(*block_index as u16)?)) + } Address::Nft(_nft) => merged_unlocks.push(Unlock::Nft(NftUnlock::new(*block_index as u16)?)), + Address::Anchor(_) => Err(BlockError::UnsupportedAddressKind(AnchorAddress::KIND))?, _ => todo!("What do we do here?"), }, None => { diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index 36ba209fe3..2089dafeaf 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -45,20 +45,19 @@ use crate::client::secret::types::StrongholdDto; use crate::{ client::{ api::{ - input_selection::{is_account_transition, Error as InputSelectionError}, - transaction::validate_signed_transaction_payload_length, + input_selection::Error as InputSelectionError, transaction::validate_signed_transaction_payload_length, verify_semantic, PreparedTransactionData, }, Error, }, types::block::{ - address::{Address, Ed25519Address}, + address::{Address, AnchorAddress, Ed25519Address}, core::UnsignedBlock, output::Output, payload::SignedTransactionPayload, signature::{Ed25519Signature, Signature}, unlock::{AccountUnlock, NftUnlock, ReferenceUnlock, SignatureUnlock, Unlock, Unlocks}, - SignedBlock, + Error as BlockError, SignedBlock, }, }; @@ -512,27 +511,20 @@ where // Assuming inputs_data is ordered by address type for (current_block_index, input) in prepared_transaction_data.inputs_data.iter().enumerate() { // Get the address that is required to unlock the input - let account_transition = is_account_transition( - &input.output, - *input.output_id(), - prepared_transaction_data.transaction.outputs(), - None, - ); - let (input_address, _) = input.output.required_and_unlocked_address( - slot_index, - input.output_metadata.output_id(), - account_transition, - )?; + let (input_address, _) = input + .output + .required_and_unlocked_address(slot_index, input.output_metadata.output_id())?; // Check if we already added an [Unlock] for this address match block_indexes.get(&input_address) { // If we already have an [Unlock] for this address, add a [Unlock] based on the address type Some(block_index) => match input_address { - Address::Account(_account) => blocks.push(Unlock::Account(AccountUnlock::new(*block_index as u16)?)), Address::Ed25519(_ed25519) => { blocks.push(Unlock::Reference(ReferenceUnlock::new(*block_index as u16)?)); } + Address::Account(_account) => blocks.push(Unlock::Account(AccountUnlock::new(*block_index as u16)?)), Address::Nft(_nft) => blocks.push(Unlock::Nft(NftUnlock::new(*block_index as u16)?)), + Address::Anchor(_) => Err(BlockError::UnsupportedAddressKind(AnchorAddress::KIND))?, _ => todo!("What do we do here?"), }, None => { diff --git a/sdk/src/client/utils.rs b/sdk/src/client/utils.rs index 9ed1442ee5..ce7f79de12 100644 --- a/sdk/src/client/utils.rs +++ b/sdk/src/client/utils.rs @@ -31,6 +31,7 @@ pub fn bech32_to_hex(bech32: impl ConvertTo) -> Result { Address::Ed25519(ed) => ed.to_string(), Address::Account(account) => account.to_string(), Address::Nft(nft) => nft.to_string(), + Address::Anchor(anchor) => anchor.to_string(), Address::ImplicitAccountCreation(implicit) => implicit.to_string(), Address::Restricted(restricted) => restricted.to_string(), }) diff --git a/sdk/src/types/block/address/account.rs b/sdk/src/types/block/address/account.rs index 935e4355f6..915c83eb29 100644 --- a/sdk/src/types/block/address/account.rs +++ b/sdk/src/types/block/address/account.rs @@ -3,12 +3,12 @@ use core::str::FromStr; -use derive_more::{AsRef, Deref, From}; +use derive_more::{AsRef, Deref, Display, From}; use crate::types::block::{output::AccountId, Error}; /// An account address. -#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, packable::Packable)] +#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, Display, packable::Packable)] #[as_ref(forward)] pub struct AccountAddress(AccountId); @@ -45,12 +45,6 @@ impl FromStr for AccountAddress { } } -impl core::fmt::Display for AccountAddress { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.0) - } -} - impl core::fmt::Debug for AccountAddress { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "AccountAddress({self})") diff --git a/sdk/src/types/block/address/anchor.rs b/sdk/src/types/block/address/anchor.rs new file mode 100644 index 0000000000..d15af00f0e --- /dev/null +++ b/sdk/src/types/block/address/anchor.rs @@ -0,0 +1,93 @@ +// Copyright 2023 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use core::str::FromStr; + +use derive_more::{AsRef, Deref, Display, From}; + +use crate::types::block::{ + output::{AnchorId, OutputId}, + Error, +}; + +/// An anchor address. +#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, Display, packable::Packable)] +#[as_ref(forward)] +pub struct AnchorAddress(AnchorId); + +impl AnchorAddress { + /// The [`Address`](crate::types::block::address::Address) kind of an [`AnchorAddress`]. + pub const KIND: u8 = 24; + /// The length of an [`AnchorAddress`]. + pub const LENGTH: usize = AnchorId::LENGTH; + + /// Creates a new [`AnchorAddress`]. + #[inline(always)] + pub fn new(id: AnchorId) -> Self { + Self::from(id) + } + + /// Returns the [`AnchorId`] of an [`AnchorAddress`]. + #[inline(always)] + pub fn anchor_id(&self) -> &AnchorId { + &self.0 + } + + /// Consumes an [`AnchorAddress`] and returns its [`AnchorId`]. + #[inline(always)] + pub fn into_anchor_id(self) -> AnchorId { + self.0 + } +} + +impl FromStr for AnchorAddress { + type Err = Error; + + fn from_str(s: &str) -> Result { + Ok(Self::new(AnchorId::from_str(s)?)) + } +} + +impl From<&OutputId> for AnchorAddress { + fn from(output_id: &OutputId) -> Self { + Self(AnchorId::from(output_id)) + } +} + +impl core::fmt::Debug for AnchorAddress { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "AnchorAddress({self})") + } +} + +#[cfg(feature = "serde")] +mod dto { + use serde::{Deserialize, Serialize}; + + use super::*; + + #[derive(Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] + struct AnchorAddressDto { + #[serde(rename = "type")] + kind: u8, + anchor_id: AnchorId, + } + + impl From<&AnchorAddress> for AnchorAddressDto { + fn from(value: &AnchorAddress) -> Self { + Self { + kind: AnchorAddress::KIND, + anchor_id: value.0, + } + } + } + + impl From for AnchorAddress { + fn from(value: AnchorAddressDto) -> Self { + Self(value.anchor_id) + } + } + + crate::impl_serde_typed_dto!(AnchorAddress, AnchorAddressDto, "anchor address"); +} diff --git a/sdk/src/types/block/address/bech32.rs b/sdk/src/types/block/address/bech32.rs index 7081f7a0a9..dd0caa2e1e 100644 --- a/sdk/src/types/block/address/bech32.rs +++ b/sdk/src/types/block/address/bech32.rs @@ -7,7 +7,7 @@ use alloc::{ }; use core::str::FromStr; -use derive_more::{AsRef, Deref}; +use derive_more::{AsRef, Deref, Display}; use packable::{ error::{UnpackError, UnpackErrorExt}, packer::Packer, @@ -17,7 +17,7 @@ use packable::{ use crate::types::block::{address::Address, ConvertTo, Error}; -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Deref)] +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Deref, Display)] #[repr(transparent)] pub struct Hrp(bech32::Hrp); @@ -46,12 +46,6 @@ impl FromStr for Hrp { } } -impl core::fmt::Display for Hrp { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - self.0.fmt(f) - } -} - impl Packable for Hrp { type UnpackError = Error; type UnpackVisitor = (); diff --git a/sdk/src/types/block/address/implicit_account_creation.rs b/sdk/src/types/block/address/implicit_account_creation.rs index cbb4344c55..ecb900e7ab 100644 --- a/sdk/src/types/block/address/implicit_account_creation.rs +++ b/sdk/src/types/block/address/implicit_account_creation.rs @@ -9,13 +9,13 @@ use crate::types::block::address::Ed25519Address; /// An implicit account creation address that can be used to convert a /// [`BasicOutput`](crate::types::block::output::BasicOutput) to an /// [`AccountOutput`](crate::types::block::output::AccountOutput). -#[derive(Copy, Clone, Debug, Display, Eq, PartialEq, Ord, PartialOrd, Hash, FromStr, AsRef, Deref, From, Packable)] +#[derive(Copy, Clone, Display, Eq, PartialEq, Ord, PartialOrd, Hash, FromStr, AsRef, Deref, From, Packable)] #[as_ref(forward)] pub struct ImplicitAccountCreationAddress(Ed25519Address); impl ImplicitAccountCreationAddress { /// The [`Address`](crate::types::block::address::Address) kind of an [`ImplicitAccountCreationAddress`]. - pub const KIND: u8 = 24; + pub const KIND: u8 = 32; /// The length of an [`ImplicitAccountCreationAddress`]. pub const LENGTH: usize = Ed25519Address::LENGTH; @@ -26,6 +26,12 @@ impl ImplicitAccountCreationAddress { } } +impl core::fmt::Debug for ImplicitAccountCreationAddress { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "ImplicitAccountCreationAddress({self})") + } +} + #[cfg(feature = "serde")] pub(crate) mod dto { use serde::{Deserialize, Serialize}; diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index d12487d675..fa6dda1a84 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 mod account; +mod anchor; mod bech32; mod ed25519; mod implicit_account_creation; @@ -10,11 +11,12 @@ mod restricted; use alloc::boxed::Box; -use derive_more::From; +use derive_more::{Display, From}; use packable::Packable; pub use self::{ account::AccountAddress, + anchor::AnchorAddress, bech32::{Bech32Address, Hrp}, ed25519::Ed25519Address, implicit_account_creation::ImplicitAccountCreationAddress, @@ -30,7 +32,7 @@ use crate::types::block::{ }; /// A generic address supporting different address kinds. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, From, Packable)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, From, Display, Packable)] #[packable(tag_type = u8, with_error = Error::InvalidAddressKind)] #[packable(unpack_error = Error)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(untagged))] @@ -44,6 +46,9 @@ pub enum Address { /// An NFT address. #[packable(tag = NftAddress::KIND)] Nft(NftAddress), + /// An anchor address. + #[packable(tag = AnchorAddress::KIND)] + Anchor(AnchorAddress), /// An implicit account creation address. #[packable(tag = ImplicitAccountCreationAddress::KIND)] ImplicitAccountCreation(ImplicitAccountCreationAddress), @@ -65,6 +70,7 @@ impl core::fmt::Debug for Address { Self::Ed25519(address) => address.fmt(f), Self::Account(address) => address.fmt(f), Self::Nft(address) => address.fmt(f), + Self::Anchor(address) => address.fmt(f), Self::ImplicitAccountCreation(address) => address.fmt(f), Self::Restricted(address) => address.fmt(f), } @@ -78,12 +84,13 @@ impl Address { Self::Ed25519(_) => Ed25519Address::KIND, Self::Account(_) => AccountAddress::KIND, Self::Nft(_) => NftAddress::KIND, + Self::Anchor(_) => AnchorAddress::KIND, Self::ImplicitAccountCreation(_) => ImplicitAccountCreationAddress::KIND, Self::Restricted(_) => RestrictedAddress::KIND, } } - crate::def_is_as_opt!(Address: Ed25519, Account, Nft, ImplicitAccountCreation, Restricted); + crate::def_is_as_opt!(Address: Ed25519, Account, Nft, Anchor, ImplicitAccountCreation, Restricted); /// Tries to create an [`Address`] from a bech32 encoded string. pub fn try_from_bech32(address: impl AsRef) -> Result { @@ -151,6 +158,8 @@ impl Address { return Err(TransactionFailureReason::InvalidInputUnlock); } } + // TODO maybe shouldn't be a semantic error but this function currently returns a TransactionFailureReason. + (Self::Anchor(_), _) => return Err(TransactionFailureReason::SemanticValidationFailed), _ => return Err(TransactionFailureReason::InvalidInputUnlock), } diff --git a/sdk/src/types/block/address/nft.rs b/sdk/src/types/block/address/nft.rs index 3d1468bf44..5bb31750be 100644 --- a/sdk/src/types/block/address/nft.rs +++ b/sdk/src/types/block/address/nft.rs @@ -3,12 +3,12 @@ use core::str::FromStr; -use derive_more::{AsRef, Deref, From}; +use derive_more::{AsRef, Deref, Display, From}; use crate::types::block::{output::NftId, Error}; /// An NFT address. -#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, packable::Packable)] +#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, Display, packable::Packable)] #[as_ref(forward)] pub struct NftAddress(NftId); @@ -45,12 +45,6 @@ impl FromStr for NftAddress { } } -impl core::fmt::Display for NftAddress { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.0) - } -} - impl core::fmt::Debug for NftAddress { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "NftAddress({self})") diff --git a/sdk/src/types/block/address/restricted.rs b/sdk/src/types/block/address/restricted.rs index b583f80f89..0ef8024ca0 100644 --- a/sdk/src/types/block/address/restricted.rs +++ b/sdk/src/types/block/address/restricted.rs @@ -19,7 +19,7 @@ pub struct RestrictedAddress { impl RestrictedAddress { /// The [`Address`](crate::types::block::address::Address) kind of a [`RestrictedAddress`]. - pub const KIND: u8 = 40; + pub const KIND: u8 = 48; /// Creates a new [`RestrictedAddress`] address from an [`Address`] with default allowed capabilities. #[inline(always)] @@ -88,9 +88,12 @@ pub enum AddressCapabilityFlag { NftOutputs, /// Can receive Delegation Outputs. DelegationOutputs, + /// Can receive Anchor Outputs. + AnchorOutputs, } impl AddressCapabilityFlag { + // Byte 0 const OUTPUTS_WITH_NATIVE_TOKENS: u8 = 0b00000001; const OUTPUTS_WITH_MANA: u8 = 0b00000010; const OUTPUTS_WITH_TIMELOCK: u8 = 0b00000100; @@ -99,10 +102,12 @@ impl AddressCapabilityFlag { const ACCOUNT_OUTPUTS: u8 = 0b00100000; const NFT_OUTPUTS: u8 = 0b01000000; const DELEGATION_OUTPUTS: u8 = 0b10000000; + // Byte 1 + const ANCHOR_OUTPUTS: u8 = 0b00000001; } impl CapabilityFlag for AddressCapabilityFlag { - type Iterator = core::array::IntoIter; + type Iterator = core::array::IntoIter; fn as_byte(&self) -> u8 { match self { @@ -114,6 +119,7 @@ impl CapabilityFlag for AddressCapabilityFlag { Self::AccountOutputs => Self::ACCOUNT_OUTPUTS, Self::NftOutputs => Self::NFT_OUTPUTS, Self::DelegationOutputs => Self::DELEGATION_OUTPUTS, + Self::AnchorOutputs => Self::ANCHOR_OUTPUTS, } } @@ -127,6 +133,7 @@ impl CapabilityFlag for AddressCapabilityFlag { | Self::AccountOutputs | Self::NftOutputs | Self::DelegationOutputs => 0, + Self::AnchorOutputs => 1, } } @@ -140,6 +147,7 @@ impl CapabilityFlag for AddressCapabilityFlag { Self::AccountOutputs, Self::NftOutputs, Self::DelegationOutputs, + Self::AnchorOutputs, ] .into_iter() } diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index 7e7026da62..ef56bb9403 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -17,7 +17,7 @@ use crate::types::block::{ output::{ feature::{BlockIssuerKeyCount, FeatureCount}, unlock_condition::UnlockConditionCount, - AccountId, ChainId, MetadataFeatureLength, NativeTokenCount, NftId, OutputIndex, StateMetadataLength, + AccountId, AnchorId, ChainId, MetadataFeatureLength, NativeTokenCount, NftId, OutputIndex, StateMetadataLength, TagFeatureLength, }, payload::{ContextInputCount, InputCount, OutputCount, TagLength, TaggedDataLength}, @@ -50,6 +50,7 @@ pub enum Error { InvalidAddress, InvalidAddressKind(u8), InvalidAccountIndex(>::Error), + InvalidAnchorIndex(>::Error), InvalidBlockKind(u8), InvalidRewardInputIndex(>::Error), InvalidStorageDepositAmount(u64), @@ -130,6 +131,7 @@ pub enum Error { InvalidUnlockReference(u16), InvalidUnlockAccount(u16), InvalidUnlockNft(u16), + InvalidUnlockAnchor(u16), InvalidUnlockConditionCount(>::Error), InvalidUnlockConditionKind(u8), InvalidFoundryZeroSerialNumber, @@ -152,7 +154,8 @@ pub enum Error { }, BlockIssuerKeysNotUniqueSorted, RemainingBytesAfterBlock, - SelfControlledAccountOutput(AccountId), + SelfControlledAnchorOutput(AnchorId), + SelfDepositAccount(AccountId), SelfDepositNft(NftId), SignaturePublicKeyMismatch { expected: String, @@ -171,6 +174,8 @@ pub enum Error { }, UnlockConditionsNotUniqueSorted, UnsupportedOutputKind(u8), + // TODO use Address::kind_str when available in 2.0 ? + UnsupportedAddressKind(u8), DuplicateOutputChain(ChainId), InvalidField(&'static str), NullDelegationValidatorId, @@ -219,6 +224,7 @@ impl fmt::Display for Error { Self::InvalidAddress => write!(f, "invalid address provided"), Self::InvalidAddressKind(k) => write!(f, "invalid address kind: {k}"), Self::InvalidAccountIndex(index) => write!(f, "invalid account index: {index}"), + Self::InvalidAnchorIndex(index) => write!(f, "invalid anchor index: {index}"), Self::InvalidBech32Hrp(e) => write!(f, "invalid bech32 hrp: {e}"), Self::InvalidCapabilitiesCount(e) => write!(f, "invalid capabilities count: {e}"), Self::InvalidBlockKind(k) => write!(f, "invalid block kind: {k}"), @@ -319,6 +325,9 @@ impl fmt::Display for Error { Self::InvalidUnlockNft(index) => { write!(f, "invalid unlock nft: {index}") } + Self::InvalidUnlockAnchor(index) => { + write!(f, "invalid unlock anchor: {index}") + } Self::InvalidUnlockConditionCount(count) => write!(f, "invalid unlock condition count: {count}"), Self::InvalidUnlockConditionKind(k) => write!(f, "invalid unlock condition kind: {k}"), Self::InvalidFoundryZeroSerialNumber => write!(f, "invalid foundry zero serial number"), @@ -350,12 +359,15 @@ impl fmt::Display for Error { Self::RemainingBytesAfterBlock => { write!(f, "remaining bytes after block") } - Self::SelfControlledAccountOutput(account_id) => { - write!(f, "self controlled account output, account ID {account_id}") + Self::SelfControlledAnchorOutput(anchor_id) => { + write!(f, "self controlled anchor output, anchor ID {anchor_id}") } Self::SelfDepositNft(nft_id) => { write!(f, "self deposit nft output, NFT ID {nft_id}") } + Self::SelfDepositAccount(account_id) => { + write!(f, "self deposit account output, account ID {account_id}") + } Self::SignaturePublicKeyMismatch { expected, actual } => { write!(f, "signature public key mismatch: expected {expected} but got {actual}",) } @@ -377,6 +389,7 @@ impl fmt::Display for Error { } Self::UnlockConditionsNotUniqueSorted => write!(f, "unlock conditions are not unique and/or sorted"), Self::UnsupportedOutputKind(k) => write!(f, "unsupported output kind: {k}"), + Self::UnsupportedAddressKind(k) => write!(f, "unsupported address kind: {k}"), Self::DuplicateOutputChain(chain_id) => write!(f, "duplicate output chain {chain_id}"), Self::InvalidField(field) => write!(f, "invalid field: {field}"), Self::NullDelegationValidatorId => write!(f, "null delegation validator ID"), diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 16714f7557..14ae4a60f3 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -8,7 +8,6 @@ use packable::{ bounded::BoundedU16, error::{UnpackError, UnpackErrorExt}, packer::Packer, - prefix::BoxedSlicePrefix, unpacker::Unpacker, Packable, }; @@ -60,37 +59,6 @@ impl From for Address { } } -/// Types of account transition. -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -pub enum AccountTransition { - /// State transition. - State, - /// Governance transition. - Governance, -} - -impl AccountTransition { - /// Checks whether the account transition is a state one. - pub fn is_state(&self) -> bool { - matches!(self, Self::State) - } - - /// Checks whether the account transition is a governance one. - pub fn is_governance(&self) -> bool { - matches!(self, Self::Governance) - } -} - -impl core::fmt::Display for AccountTransition { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match self { - Self::State => write!(f, "state"), - Self::Governance => write!(f, "governance"), - } - } -} - /// #[derive(Clone)] #[must_use] @@ -99,8 +67,6 @@ pub struct AccountOutputBuilder { mana: u64, native_tokens: BTreeSet, account_id: AccountId, - state_index: Option, - state_metadata: Vec, foundry_counter: Option, unlock_conditions: BTreeSet, features: BTreeSet, @@ -125,8 +91,6 @@ impl AccountOutputBuilder { mana: Default::default(), native_tokens: BTreeSet::new(), account_id, - state_index: None, - state_metadata: Vec::new(), foundry_counter: None, unlock_conditions: BTreeSet::new(), features: BTreeSet::new(), @@ -176,20 +140,6 @@ impl AccountOutputBuilder { self } - /// - #[inline(always)] - pub fn with_state_index(mut self, state_index: impl Into>) -> Self { - self.state_index = state_index.into(); - self - } - - /// - #[inline(always)] - pub fn with_state_metadata(mut self, state_metadata: impl Into>) -> Self { - self.state_metadata = state_metadata.into(); - self - } - /// #[inline(always)] pub fn with_foundry_counter(mut self, foundry_counter: impl Into>) -> Self { @@ -283,16 +233,9 @@ impl AccountOutputBuilder { /// pub fn finish(self) -> Result { - let state_index = self.state_index.unwrap_or(0); let foundry_counter = self.foundry_counter.unwrap_or(0); - let state_metadata = self - .state_metadata - .into_boxed_slice() - .try_into() - .map_err(Error::InvalidStateMetadataLength)?; - - verify_index_counter(&self.account_id, state_index, foundry_counter)?; + verify_index_counter(&self.account_id, foundry_counter)?; let unlock_conditions = UnlockConditions::from_set(self.unlock_conditions)?; @@ -311,8 +254,6 @@ impl AccountOutputBuilder { mana: self.mana, native_tokens: NativeTokens::from_set(self.native_tokens)?, account_id: self.account_id, - state_index, - state_metadata, foundry_counter, unlock_conditions, features, @@ -358,8 +299,6 @@ impl From<&AccountOutput> for AccountOutputBuilder { mana: output.mana, native_tokens: output.native_tokens.iter().copied().collect(), account_id: output.account_id, - state_index: Some(output.state_index), - state_metadata: output.state_metadata.to_vec(), foundry_counter: Some(output.foundry_counter), unlock_conditions: output.unlock_conditions.iter().cloned().collect(), features: output.features.iter().cloned().collect(), @@ -380,10 +319,6 @@ pub struct AccountOutput { native_tokens: NativeTokens, // Unique identifier of the account. account_id: AccountId, - // A counter that must increase by 1 every time the account is state transitioned. - state_index: u32, - // Metadata that can only be changed by the state controller. - state_metadata: BoxedSlicePrefix, // A counter that denotes the number of foundries created by this account. foundry_counter: u32, unlock_conditions: UnlockConditions, @@ -399,8 +334,7 @@ impl AccountOutput { /// Maximum possible length in bytes of the state metadata. pub const STATE_METADATA_LENGTH_MAX: u16 = 8192; /// The set of allowed [`UnlockCondition`]s for an [`AccountOutput`]. - pub const ALLOWED_UNLOCK_CONDITIONS: UnlockConditionFlags = - UnlockConditionFlags::STATE_CONTROLLER_ADDRESS.union(UnlockConditionFlags::GOVERNOR_ADDRESS); + pub const ALLOWED_UNLOCK_CONDITIONS: UnlockConditionFlags = UnlockConditionFlags::ADDRESS; /// The set of allowed [`Feature`]s for an [`AccountOutput`]. pub const ALLOWED_FEATURES: FeatureFlags = FeatureFlags::SENDER.union(FeatureFlags::METADATA); /// The set of allowed immutable [`Feature`]s for an [`AccountOutput`]. @@ -451,18 +385,6 @@ impl AccountOutput { self.account_id.or_from_output_id(output_id) } - /// - #[inline(always)] - pub fn state_index(&self) -> u32 { - self.state_index - } - - /// - #[inline(always)] - pub fn state_metadata(&self) -> &[u8] { - &self.state_metadata - } - /// #[inline(always)] pub fn foundry_counter(&self) -> u32 { @@ -489,20 +411,10 @@ impl AccountOutput { /// #[inline(always)] - pub fn state_controller_address(&self) -> &Address { - // An AccountOutput must have a StateControllerAddressUnlockCondition. - self.unlock_conditions - .state_controller_address() - .map(|unlock_condition| unlock_condition.address()) - .unwrap() - } - - /// - #[inline(always)] - pub fn governor_address(&self) -> &Address { - // An AccountOutput must have a GovernorAddressUnlockCondition. + pub fn address(&self) -> &Address { + // An AccountOutput must have an AddressUnlockCondition. self.unlock_conditions - .governor_address() + .address() .map(|unlock_condition| unlock_condition.address()) .unwrap() } @@ -525,30 +437,19 @@ impl AccountOutput { unlock: &Unlock, context: &mut SemanticValidationContext<'_>, ) -> Result<(), TransactionFailureReason> { + self.unlock_conditions() + .locked_address(self.address(), context.transaction.creation_slot()) + .unlock(unlock, context)?; + let account_id = if self.account_id().is_null() { AccountId::from(output_id) } else { *self.account_id() }; - let next_state = context.output_chains.get(&ChainId::from(account_id)); - match next_state { - Some(Output::Account(next_state)) => { - if self.state_index() == next_state.state_index() { - self.governor_address().unlock(unlock, context)?; - } else { - self.state_controller_address().unlock(unlock, context)?; - // Only a state transition can be used to consider the account address for output unlocks and - // sender/issuer validations. - context - .unlocked_addresses - .insert(Address::from(AccountAddress::from(account_id))); - } - } - None => self.governor_address().unlock(unlock, context)?, - // The next state can only be an account output since it is identified by an account chain identifier. - Some(_) => unreachable!(), - }; + context + .unlocked_addresses + .insert(Address::from(AccountAddress::from(account_id))); Ok(()) } @@ -564,56 +465,46 @@ impl AccountOutput { return Err(StateTransitionError::MutatedImmutableField); } - if next_state.state_index == current_state.state_index + 1 { - // State transition. - if current_state.state_controller_address() != next_state.state_controller_address() - || current_state.governor_address() != next_state.governor_address() - || current_state.features.metadata() != next_state.features.metadata() - { - return Err(StateTransitionError::MutatedFieldWithoutRights); - } - - let created_foundries = outputs.iter().filter_map(|output| { - if let Output::Foundry(foundry) = output { - if foundry.account_address().account_id() == &next_state.account_id - && !input_chains.contains_key(&foundry.chain_id()) - { - Some(foundry) - } else { - None - } + // TODO update when TIP is updated + // // Governance transition. + // if current_state.amount != next_state.amount + // || current_state.native_tokens != next_state.native_tokens + // || current_state.foundry_counter != next_state.foundry_counter + // { + // return Err(StateTransitionError::MutatedFieldWithoutRights); + // } + + // // State transition. + // if current_state.features.metadata() != next_state.features.metadata() { + // return Err(StateTransitionError::MutatedFieldWithoutRights); + // } + + let created_foundries = outputs.iter().filter_map(|output| { + if let Output::Foundry(foundry) = output { + if foundry.account_address().account_id() == &next_state.account_id + && !input_chains.contains_key(&foundry.chain_id()) + { + Some(foundry) } else { None } - }); + } else { + None + } + }); - let mut created_foundries_count = 0; + let mut created_foundries_count = 0; - for foundry in created_foundries { - created_foundries_count += 1; + for foundry in created_foundries { + created_foundries_count += 1; - if foundry.serial_number() != current_state.foundry_counter + created_foundries_count { - return Err(StateTransitionError::UnsortedCreatedFoundries); - } + if foundry.serial_number() != current_state.foundry_counter + created_foundries_count { + return Err(StateTransitionError::UnsortedCreatedFoundries); } + } - if current_state.foundry_counter + created_foundries_count != next_state.foundry_counter { - return Err(StateTransitionError::InconsistentCreatedFoundriesCount); - } - } else if next_state.state_index == current_state.state_index { - // Governance transition. - if current_state.amount != next_state.amount - || current_state.native_tokens != next_state.native_tokens - || current_state.state_metadata != next_state.state_metadata - || current_state.foundry_counter != next_state.foundry_counter - { - return Err(StateTransitionError::MutatedFieldWithoutRights); - } - } else { - return Err(StateTransitionError::UnsupportedStateIndexOperation { - current_state: current_state.state_index, - next_state: next_state.state_index, - }); + if current_state.foundry_counter + created_foundries_count != next_state.foundry_counter { + return Err(StateTransitionError::InconsistentCreatedFoundriesCount); } Ok(()) @@ -669,8 +560,6 @@ impl Packable for AccountOutput { self.mana.pack(packer)?; self.native_tokens.pack(packer)?; self.account_id.pack(packer)?; - self.state_index.pack(packer)?; - self.state_metadata.pack(packer)?; self.foundry_counter.pack(packer)?; self.unlock_conditions.pack(packer)?; self.features.pack(packer)?; @@ -691,14 +580,11 @@ impl Packable for AccountOutput { let native_tokens = NativeTokens::unpack::<_, VERIFY>(unpacker, &())?; let account_id = AccountId::unpack::<_, VERIFY>(unpacker, &()).coerce()?; - let state_index = u32::unpack::<_, VERIFY>(unpacker, &()).coerce()?; - let state_metadata = BoxedSlicePrefix::::unpack::<_, VERIFY>(unpacker, &()) - .map_packable_err(|err| Error::InvalidStateMetadataLength(err.into_prefix_err().into()))?; let foundry_counter = u32::unpack::<_, VERIFY>(unpacker, &()).coerce()?; if VERIFY { - verify_index_counter(&account_id, state_index, foundry_counter).map_err(UnpackError::Packable)?; + verify_index_counter(&account_id, foundry_counter).map_err(UnpackError::Packable)?; } let unlock_conditions = UnlockConditions::unpack::<_, VERIFY>(unpacker, visitor)?; @@ -725,8 +611,6 @@ impl Packable for AccountOutput { mana, native_tokens, account_id, - state_index, - state_metadata, foundry_counter, unlock_conditions, features, @@ -736,8 +620,8 @@ impl Packable for AccountOutput { } #[inline] -fn verify_index_counter(account_id: &AccountId, state_index: u32, foundry_counter: u32) -> Result<(), Error> { - if account_id.is_null() && (state_index != 0 || foundry_counter != 0) { +fn verify_index_counter(account_id: &AccountId, foundry_counter: u32) -> Result<(), Error> { + if account_id.is_null() && foundry_counter != 0 { Err(Error::NonZeroStateIndexOrFoundryCounter) } else { Ok(()) @@ -745,24 +629,14 @@ fn verify_index_counter(account_id: &AccountId, state_index: u32, foundry_counte } fn verify_unlock_conditions(unlock_conditions: &UnlockConditions, account_id: &AccountId) -> Result<(), Error> { - if let Some(unlock_condition) = unlock_conditions.state_controller_address() { + if let Some(unlock_condition) = unlock_conditions.address() { if let Address::Account(account_address) = unlock_condition.address() { if account_address.account_id() == account_id { - return Err(Error::SelfControlledAccountOutput(*account_id)); + return Err(Error::SelfDepositAccount(*account_id)); } } } else { - return Err(Error::MissingStateControllerUnlockCondition); - } - - if let Some(unlock_condition) = unlock_conditions.governor_address() { - if let Address::Account(account_address) = unlock_condition.address() { - if account_address.account_id() == account_id { - return Err(Error::SelfControlledAccountOutput(*account_id)); - } - } - } else { - return Err(Error::MissingGovernorUnlockCondition); + return Err(Error::MissingAddressUnlockCondition); } verify_allowed_unlock_conditions(unlock_conditions, AccountOutput::ALLOWED_UNLOCK_CONDITIONS) @@ -770,8 +644,6 @@ fn verify_unlock_conditions(unlock_conditions: &UnlockConditions, account_id: &A #[cfg(feature = "serde")] pub(crate) mod dto { - use alloc::boxed::Box; - use serde::{Deserialize, Serialize}; use super::*; @@ -780,7 +652,7 @@ pub(crate) mod dto { block::{output::unlock_condition::dto::UnlockConditionDto, Error}, TryFromDto, }, - utils::serde::{prefix_hex_bytes, string}, + utils::serde::string, }; /// Describes an account in the ledger that can be controlled by the state and governance controllers. @@ -796,9 +668,6 @@ pub(crate) mod dto { #[serde(skip_serializing_if = "Vec::is_empty", default)] pub native_tokens: Vec, pub account_id: AccountId, - pub state_index: u32, - #[serde(skip_serializing_if = "<[_]>::is_empty", default, with = "prefix_hex_bytes")] - pub state_metadata: Box<[u8]>, pub foundry_counter: u32, pub unlock_conditions: Vec, #[serde(skip_serializing_if = "Vec::is_empty", default)] @@ -815,8 +684,6 @@ pub(crate) mod dto { mana: value.mana(), native_tokens: value.native_tokens().to_vec(), account_id: *value.account_id(), - state_index: value.state_index(), - state_metadata: value.state_metadata().into(), foundry_counter: value.foundry_counter(), unlock_conditions: value.unlock_conditions().iter().map(Into::into).collect::<_>(), features: value.features().to_vec(), @@ -832,12 +699,10 @@ pub(crate) mod dto { fn try_from_dto_with_params_inner(dto: Self::Dto, params: ValidationParams<'_>) -> Result { let mut builder = AccountOutputBuilder::new_with_amount(dto.amount, dto.account_id) .with_mana(dto.mana) - .with_state_index(dto.state_index) .with_foundry_counter(dto.foundry_counter) .with_native_tokens(dto.native_tokens) .with_features(dto.features) - .with_immutable_features(dto.immutable_features) - .with_state_metadata(dto.state_metadata); + .with_immutable_features(dto.immutable_features); for u in dto.unlock_conditions { builder = builder.add_unlock_condition(UnlockCondition::try_from_dto_with_params(u, ¶ms)?); @@ -854,8 +719,6 @@ pub(crate) mod dto { mana: u64, native_tokens: Option>, account_id: &AccountId, - state_index: Option, - state_metadata: Option>, foundry_counter: Option, unlock_conditions: Vec, features: Option>, @@ -875,14 +738,6 @@ pub(crate) mod dto { builder = builder.with_native_tokens(native_tokens); } - if let Some(state_index) = state_index { - builder = builder.with_state_index(state_index); - } - - if let Some(state_metadata) = state_metadata { - builder = builder.with_state_metadata(state_metadata); - } - if let Some(foundry_counter) = foundry_counter { builder = builder.with_foundry_counter(foundry_counter); } @@ -918,12 +773,8 @@ mod tests { rand::{ address::rand_account_address, output::{ - feature::rand_allowed_features, - rand_account_id, rand_account_output, - unlock_condition::{ - rand_governor_address_unlock_condition_different_from, - rand_state_controller_address_unlock_condition_different_from, - }, + feature::rand_allowed_features, rand_account_id, rand_account_output, + unlock_condition::rand_address_unlock_condition_different_from_account_id, }, }, }, @@ -945,8 +796,6 @@ mod tests { output.mana(), Some(output.native_tokens().to_vec()), output.account_id(), - output.state_index().into(), - output.state_metadata().to_owned().into(), output.foundry_counter().into(), output.unlock_conditions().iter().map(Into::into).collect(), Some(output.features().to_vec()), @@ -958,8 +807,7 @@ mod tests { let account_id = rand_account_id(); let foundry_id = FoundryId::build(&rand_account_address(), 0, SimpleTokenScheme::KIND); - let gov_address = rand_governor_address_unlock_condition_different_from(&account_id); - let state_address = rand_state_controller_address_unlock_condition_different_from(&account_id); + let address = rand_address_unlock_condition_different_from_account_id(&account_id); let test_split_dto = |builder: AccountOutputBuilder| { let output_split = AccountOutput::try_from_dtos( @@ -967,8 +815,6 @@ mod tests { builder.mana, Some(builder.native_tokens.iter().copied().collect()), &builder.account_id, - builder.state_index, - builder.state_metadata.to_owned().into(), builder.foundry_counter, builder.unlock_conditions.iter().map(Into::into).collect(), Some(builder.features.iter().cloned().collect()), @@ -981,8 +827,7 @@ mod tests { let builder = AccountOutput::build_with_amount(100, account_id) .add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) - .add_unlock_condition(gov_address.clone()) - .add_unlock_condition(state_address.clone()) + .add_unlock_condition(address.clone()) .with_features(rand_allowed_features(AccountOutput::ALLOWED_FEATURES)) .with_immutable_features(rand_allowed_features(AccountOutput::ALLOWED_IMMUTABLE_FEATURES)); test_split_dto(builder); @@ -990,8 +835,7 @@ mod tests { let builder = AccountOutput::build_with_minimum_storage_deposit(protocol_parameters.rent_structure(), account_id) .add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) - .add_unlock_condition(gov_address) - .add_unlock_condition(state_address) + .add_unlock_condition(address) .with_features(rand_allowed_features(AccountOutput::ALLOWED_FEATURES)) .with_immutable_features(rand_allowed_features(AccountOutput::ALLOWED_IMMUTABLE_FEATURES)); test_split_dto(builder); diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs new file mode 100644 index 0000000000..703b7719fd --- /dev/null +++ b/sdk/src/types/block/output/anchor.rs @@ -0,0 +1,927 @@ +// Copyright 2023 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use alloc::{collections::BTreeSet, vec::Vec}; + +use hashbrown::HashMap; +use packable::{ + bounded::BoundedU16, + error::{UnpackError, UnpackErrorExt}, + packer::Packer, + prefix::BoxedSlicePrefix, + unpacker::Unpacker, + Packable, +}; + +use crate::types::{ + block::{ + address::{Address, AnchorAddress}, + output::{ + feature::{verify_allowed_features, Feature, FeatureFlags, Features}, + unlock_condition::{ + verify_allowed_unlock_conditions, UnlockCondition, UnlockConditionFlags, UnlockConditions, + }, + verify_output_amount_min, verify_output_amount_packable, verify_output_amount_supply, ChainId, NativeToken, + NativeTokens, Output, OutputBuilderAmount, OutputId, Rent, RentStructure, StateTransitionError, + StateTransitionVerifier, + }, + payload::signed_transaction::TransactionCapabilityFlag, + protocol::ProtocolParameters, + semantic::{SemanticValidationContext, TransactionFailureReason}, + unlock::Unlock, + Error, + }, + ValidationParams, +}; + +crate::impl_id!( + /// A unique identifier of an anchor. + pub AnchorId { + pub const LENGTH: usize = 32; + } +); + +impl From<&OutputId> for AnchorId { + fn from(output_id: &OutputId) -> Self { + Self::from(output_id.hash()) + } +} + +impl AnchorId { + /// + pub fn or_from_output_id(self, output_id: &OutputId) -> Self { + if self.is_null() { Self::from(output_id) } else { self } + } +} + +impl From for Address { + fn from(value: AnchorId) -> Self { + Self::Anchor(AnchorAddress::new(value)) + } +} + +/// Types of anchor transition. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub enum AnchorTransition { + /// State transition. + State, + /// Governance transition. + Governance, +} + +impl AnchorTransition { + /// Checks whether the anchor transition is a state one. + pub fn is_state(&self) -> bool { + matches!(self, Self::State) + } + + /// Checks whether the anchor transition is a governance one. + pub fn is_governance(&self) -> bool { + matches!(self, Self::Governance) + } +} + +impl core::fmt::Display for AnchorTransition { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::State => write!(f, "state"), + Self::Governance => write!(f, "governance"), + } + } +} + +/// +#[derive(Clone)] +#[must_use] +pub struct AnchorOutputBuilder { + amount: OutputBuilderAmount, + mana: u64, + native_tokens: BTreeSet, + anchor_id: AnchorId, + state_index: Option, + state_metadata: Vec, + unlock_conditions: BTreeSet, + features: BTreeSet, + immutable_features: BTreeSet, +} + +impl AnchorOutputBuilder { + /// Creates an [`AnchorOutputBuilder`] with a provided amount. + pub fn new_with_amount(amount: u64, anchor_id: AnchorId) -> Self { + Self::new(OutputBuilderAmount::Amount(amount), anchor_id) + } + + /// Creates an [`AnchorOutputBuilder`] with a provided rent structure. + /// The amount will be set to the minimum storage deposit. + pub fn new_with_minimum_storage_deposit(rent_structure: RentStructure, anchor_id: AnchorId) -> Self { + Self::new(OutputBuilderAmount::MinimumStorageDeposit(rent_structure), anchor_id) + } + + fn new(amount: OutputBuilderAmount, anchor_id: AnchorId) -> Self { + Self { + amount, + mana: Default::default(), + native_tokens: BTreeSet::new(), + anchor_id, + state_index: None, + state_metadata: Vec::new(), + unlock_conditions: BTreeSet::new(), + features: BTreeSet::new(), + immutable_features: BTreeSet::new(), + } + } + + /// Sets the amount to the provided value. + #[inline(always)] + pub fn with_amount(mut self, amount: u64) -> Self { + self.amount = OutputBuilderAmount::Amount(amount); + self + } + + /// Sets the amount to the minimum storage deposit. + #[inline(always)] + pub fn with_minimum_storage_deposit(mut self, rent_structure: RentStructure) -> Self { + self.amount = OutputBuilderAmount::MinimumStorageDeposit(rent_structure); + self + } + + /// Sets the mana to the provided value. + #[inline(always)] + pub fn with_mana(mut self, mana: u64) -> Self { + self.mana = mana; + self + } + + /// + #[inline(always)] + pub fn add_native_token(mut self, native_token: NativeToken) -> Self { + self.native_tokens.insert(native_token); + self + } + + /// + #[inline(always)] + pub fn with_native_tokens(mut self, native_tokens: impl IntoIterator) -> Self { + self.native_tokens = native_tokens.into_iter().collect(); + self + } + + /// Sets the anchor ID to the provided value. + #[inline(always)] + pub fn with_anchor_id(mut self, anchor_id: AnchorId) -> Self { + self.anchor_id = anchor_id; + self + } + + /// + #[inline(always)] + pub fn with_state_index(mut self, state_index: impl Into>) -> Self { + self.state_index = state_index.into(); + self + } + + /// + #[inline(always)] + pub fn with_state_metadata(mut self, state_metadata: impl Into>) -> Self { + self.state_metadata = state_metadata.into(); + self + } + + /// Adds an [`UnlockCondition`] to the builder, if one does not already exist of that type. + #[inline(always)] + pub fn add_unlock_condition(mut self, unlock_condition: impl Into) -> Self { + self.unlock_conditions.insert(unlock_condition.into()); + self + } + + /// Sets the [`UnlockConditions`]s in the builder, overwriting any existing values. + #[inline(always)] + pub fn with_unlock_conditions( + mut self, + unlock_conditions: impl IntoIterator>, + ) -> Self { + self.unlock_conditions = unlock_conditions.into_iter().map(Into::into).collect(); + self + } + + /// Replaces an [`UnlockCondition`] of the builder with a new one, or adds it. + pub fn replace_unlock_condition(mut self, unlock_condition: impl Into) -> Self { + self.unlock_conditions.replace(unlock_condition.into()); + self + } + + /// Clears all [`UnlockConditions`]s from the builder. + #[inline(always)] + pub fn clear_unlock_conditions(mut self) -> Self { + self.unlock_conditions.clear(); + self + } + + /// Adds a [`Feature`] to the builder, if one does not already exist of that type. + #[inline(always)] + pub fn add_feature(mut self, feature: impl Into) -> Self { + self.features.insert(feature.into()); + self + } + + /// Sets the [`Feature`]s in the builder, overwriting any existing values. + #[inline(always)] + pub fn with_features(mut self, features: impl IntoIterator>) -> Self { + self.features = features.into_iter().map(Into::into).collect(); + self + } + + /// Replaces a [`Feature`] of the builder with a new one, or adds it. + pub fn replace_feature(mut self, feature: impl Into) -> Self { + self.features.replace(feature.into()); + self + } + + /// Clears all [`Feature`]s from the builder. + #[inline(always)] + pub fn clear_features(mut self) -> Self { + self.features.clear(); + self + } + + /// Adds an immutable [`Feature`] to the builder, if one does not already exist of that type. + #[inline(always)] + pub fn add_immutable_feature(mut self, immutable_feature: impl Into) -> Self { + self.immutable_features.insert(immutable_feature.into()); + self + } + + /// Sets the immutable [`Feature`]s in the builder, overwriting any existing values. + #[inline(always)] + pub fn with_immutable_features(mut self, immutable_features: impl IntoIterator>) -> Self { + self.immutable_features = immutable_features.into_iter().map(Into::into).collect(); + self + } + + /// Replaces an immutable [`Feature`] of the builder with a new one, or adds it. + pub fn replace_immutable_feature(mut self, immutable_feature: impl Into) -> Self { + self.immutable_features.replace(immutable_feature.into()); + self + } + + /// Clears all immutable [`Feature`]s from the builder. + #[inline(always)] + pub fn clear_immutable_features(mut self) -> Self { + self.immutable_features.clear(); + self + } + + /// + pub fn finish(self) -> Result { + let state_index = self.state_index.unwrap_or(0); + + let state_metadata = self + .state_metadata + .into_boxed_slice() + .try_into() + .map_err(Error::InvalidStateMetadataLength)?; + + verify_index_counter(&self.anchor_id, state_index)?; + + let unlock_conditions = UnlockConditions::from_set(self.unlock_conditions)?; + + verify_unlock_conditions(&unlock_conditions, &self.anchor_id)?; + + let features = Features::from_set(self.features)?; + + verify_allowed_features(&features, AnchorOutput::ALLOWED_FEATURES)?; + + let immutable_features = Features::from_set(self.immutable_features)?; + + verify_allowed_features(&immutable_features, AnchorOutput::ALLOWED_IMMUTABLE_FEATURES)?; + + let mut output = AnchorOutput { + amount: 1, + mana: self.mana, + native_tokens: NativeTokens::from_set(self.native_tokens)?, + anchor_id: self.anchor_id, + state_index, + state_metadata, + unlock_conditions, + features, + immutable_features, + }; + + output.amount = match self.amount { + OutputBuilderAmount::Amount(amount) => amount, + OutputBuilderAmount::MinimumStorageDeposit(rent_structure) => { + Output::Anchor(output.clone()).rent_cost(rent_structure) + } + }; + + verify_output_amount_min(output.amount)?; + + Ok(output) + } + + /// + pub fn finish_with_params<'a>(self, params: impl Into> + Send) -> Result { + let output = self.finish()?; + + if let Some(token_supply) = params.into().token_supply() { + verify_output_amount_supply(output.amount, token_supply)?; + } + + Ok(output) + } + + /// Finishes the [`AnchorOutputBuilder`] into an [`Output`]. + pub fn finish_output<'a>(self, params: impl Into> + Send) -> Result { + Ok(Output::Anchor(self.finish_with_params(params)?)) + } +} + +impl From<&AnchorOutput> for AnchorOutputBuilder { + fn from(output: &AnchorOutput) -> Self { + Self { + amount: OutputBuilderAmount::Amount(output.amount), + mana: output.mana, + native_tokens: output.native_tokens.iter().copied().collect(), + anchor_id: output.anchor_id, + state_index: Some(output.state_index), + state_metadata: output.state_metadata.to_vec(), + unlock_conditions: output.unlock_conditions.iter().cloned().collect(), + features: output.features.iter().cloned().collect(), + immutable_features: output.immutable_features.iter().cloned().collect(), + } + } +} + +pub(crate) type StateMetadataLength = BoundedU16<0, { AnchorOutput::STATE_METADATA_LENGTH_MAX }>; + +/// Describes an anchor in the ledger that can be controlled by the state and governance controllers. +#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +pub struct AnchorOutput { + /// Amount of IOTA coins held by the output. + amount: u64, + mana: u64, + /// Native tokens held by the output. + native_tokens: NativeTokens, + /// Unique identifier of the anchor. + anchor_id: AnchorId, + /// A counter that must increase by 1 every time the anchor is state transitioned. + state_index: u32, + /// Metadata that can only be changed by the state controller. + state_metadata: BoxedSlicePrefix, + /// Define how the output can be unlocked in a transaction. + unlock_conditions: UnlockConditions, + /// Features of the output. + features: Features, + /// Immutable features of the output. + immutable_features: Features, +} + +impl AnchorOutput { + /// The [`Output`](crate::types::block::output::Output) kind of an [`AnchorOutput`]. + /// TODO + pub const KIND: u8 = 255; + /// Maximum possible length in bytes of the state metadata. + pub const STATE_METADATA_LENGTH_MAX: u16 = 8192; + /// The set of allowed [`UnlockCondition`]s for an [`AnchorOutput`]. + pub const ALLOWED_UNLOCK_CONDITIONS: UnlockConditionFlags = + UnlockConditionFlags::STATE_CONTROLLER_ADDRESS.union(UnlockConditionFlags::GOVERNOR_ADDRESS); + /// The set of allowed [`Feature`]s for an [`AnchorOutput`]. + pub const ALLOWED_FEATURES: FeatureFlags = FeatureFlags::SENDER.union(FeatureFlags::METADATA); + /// The set of allowed immutable [`Feature`]s for an [`AnchorOutput`]. + pub const ALLOWED_IMMUTABLE_FEATURES: FeatureFlags = FeatureFlags::ISSUER.union(FeatureFlags::METADATA); + + /// Creates a new [`AnchorOutputBuilder`] with a provided amount. + #[inline(always)] + pub fn build_with_amount(amount: u64, anchor_id: AnchorId) -> AnchorOutputBuilder { + AnchorOutputBuilder::new_with_amount(amount, anchor_id) + } + + /// Creates a new [`AnchorOutputBuilder`] with a provided rent structure. + /// The amount will be set to the minimum storage deposit. + #[inline(always)] + pub fn build_with_minimum_storage_deposit( + rent_structure: RentStructure, + anchor_id: AnchorId, + ) -> AnchorOutputBuilder { + AnchorOutputBuilder::new_with_minimum_storage_deposit(rent_structure, anchor_id) + } + + /// + #[inline(always)] + pub fn amount(&self) -> u64 { + self.amount + } + + #[inline(always)] + pub fn mana(&self) -> u64 { + self.mana + } + + /// + #[inline(always)] + pub fn native_tokens(&self) -> &NativeTokens { + &self.native_tokens + } + + /// + #[inline(always)] + pub fn anchor_id(&self) -> &AnchorId { + &self.anchor_id + } + + /// Returns the anchor ID if not null, or creates it from the output ID. + #[inline(always)] + pub fn anchor_id_non_null(&self, output_id: &OutputId) -> AnchorId { + self.anchor_id.or_from_output_id(output_id) + } + + /// + #[inline(always)] + pub fn state_index(&self) -> u32 { + self.state_index + } + + /// + #[inline(always)] + pub fn state_metadata(&self) -> &[u8] { + &self.state_metadata + } + + /// + #[inline(always)] + pub fn unlock_conditions(&self) -> &UnlockConditions { + &self.unlock_conditions + } + + /// + #[inline(always)] + pub fn features(&self) -> &Features { + &self.features + } + + /// + #[inline(always)] + pub fn immutable_features(&self) -> &Features { + &self.immutable_features + } + + /// + #[inline(always)] + pub fn state_controller_address(&self) -> &Address { + // An AnchorOutput must have a StateControllerAddressUnlockCondition. + self.unlock_conditions + .state_controller_address() + .map(|unlock_condition| unlock_condition.address()) + .unwrap() + } + + /// + #[inline(always)] + pub fn governor_address(&self) -> &Address { + // An AnchorOutput must have a GovernorAddressUnlockCondition. + self.unlock_conditions + .governor_address() + .map(|unlock_condition| unlock_condition.address()) + .unwrap() + } + + /// + #[inline(always)] + pub fn chain_id(&self) -> ChainId { + ChainId::Anchor(self.anchor_id) + } + + /// Returns the anchor address for this output. + pub fn anchor_address(&self, output_id: &OutputId) -> AnchorAddress { + AnchorAddress::new(self.anchor_id_non_null(output_id)) + } + + /// + pub fn unlock( + &self, + output_id: &OutputId, + unlock: &Unlock, + context: &mut SemanticValidationContext<'_>, + ) -> Result<(), TransactionFailureReason> { + let anchor_id = if self.anchor_id().is_null() { + AnchorId::from(output_id) + } else { + *self.anchor_id() + }; + let next_state = context.output_chains.get(&ChainId::from(anchor_id)); + + match next_state { + Some(Output::Anchor(next_state)) => { + if self.state_index() == next_state.state_index() { + self.governor_address().unlock(unlock, context)?; + } else { + self.state_controller_address().unlock(unlock, context)?; + // Only a state transition can be used to consider the anchor address for output unlocks and + // sender/issuer validations. + context + .unlocked_addresses + .insert(Address::from(AnchorAddress::from(anchor_id))); + } + } + None => self.governor_address().unlock(unlock, context)?, + // The next state can only be an anchor output since it is identified by an anchor chain identifier. + Some(_) => unreachable!(), + }; + + Ok(()) + } + + // Transition, just without full ValidationContext + pub(crate) fn transition_inner( + current_state: &Self, + next_state: &Self, + _input_chains: &HashMap, + _outputs: &[Output], + ) -> Result<(), StateTransitionError> { + if current_state.immutable_features != next_state.immutable_features { + return Err(StateTransitionError::MutatedImmutableField); + } + + if next_state.state_index == current_state.state_index + 1 { + // State transition. + if current_state.state_controller_address() != next_state.state_controller_address() + || current_state.governor_address() != next_state.governor_address() + || current_state.features.metadata() != next_state.features.metadata() + { + return Err(StateTransitionError::MutatedFieldWithoutRights); + } + } else if next_state.state_index == current_state.state_index { + // Governance transition. + if current_state.amount != next_state.amount + || current_state.native_tokens != next_state.native_tokens + || current_state.state_metadata != next_state.state_metadata + { + return Err(StateTransitionError::MutatedFieldWithoutRights); + } + } else { + return Err(StateTransitionError::UnsupportedStateIndexOperation { + current_state: current_state.state_index, + next_state: next_state.state_index, + }); + } + + Ok(()) + } +} + +impl StateTransitionVerifier for AnchorOutput { + fn creation(next_state: &Self, context: &SemanticValidationContext<'_>) -> Result<(), StateTransitionError> { + if !next_state.anchor_id.is_null() { + return Err(StateTransitionError::NonZeroCreatedId); + } + + if let Some(issuer) = next_state.immutable_features().issuer() { + if !context.unlocked_addresses.contains(issuer.address()) { + return Err(StateTransitionError::IssuerNotUnlocked); + } + } + + Ok(()) + } + + fn transition( + current_state: &Self, + next_state: &Self, + context: &SemanticValidationContext<'_>, + ) -> Result<(), StateTransitionError> { + Self::transition_inner( + current_state, + next_state, + &context.input_chains, + context.transaction.outputs(), + ) + } + + fn destruction(_current_state: &Self, context: &SemanticValidationContext<'_>) -> Result<(), StateTransitionError> { + if !context + .transaction + .capabilities() + .has_capability(TransactionCapabilityFlag::DestroyAnchorOutputs) + { + // TODO: add a variant https://github.com/iotaledger/iota-sdk/issues/1430 + return Err(StateTransitionError::UnsupportedStateTransition); + } + Ok(()) + } +} + +impl Packable for AnchorOutput { + type UnpackError = Error; + type UnpackVisitor = ProtocolParameters; + + fn pack(&self, packer: &mut P) -> Result<(), P::Error> { + self.amount.pack(packer)?; + self.mana.pack(packer)?; + self.native_tokens.pack(packer)?; + self.anchor_id.pack(packer)?; + self.state_index.pack(packer)?; + self.state_metadata.pack(packer)?; + self.unlock_conditions.pack(packer)?; + self.features.pack(packer)?; + self.immutable_features.pack(packer)?; + + Ok(()) + } + + fn unpack( + unpacker: &mut U, + visitor: &Self::UnpackVisitor, + ) -> Result> { + let amount = u64::unpack::<_, VERIFY>(unpacker, &()).coerce()?; + + verify_output_amount_packable::(&amount, visitor).map_err(UnpackError::Packable)?; + + let mana = u64::unpack::<_, VERIFY>(unpacker, &()).coerce()?; + + let native_tokens = NativeTokens::unpack::<_, VERIFY>(unpacker, &())?; + let anchor_id = AnchorId::unpack::<_, VERIFY>(unpacker, &()).coerce()?; + let state_index = u32::unpack::<_, VERIFY>(unpacker, &()).coerce()?; + let state_metadata = BoxedSlicePrefix::::unpack::<_, VERIFY>(unpacker, &()) + .map_packable_err(|err| Error::InvalidStateMetadataLength(err.into_prefix_err().into()))?; + + if VERIFY { + verify_index_counter(&anchor_id, state_index).map_err(UnpackError::Packable)?; + } + + let unlock_conditions = UnlockConditions::unpack::<_, VERIFY>(unpacker, visitor)?; + + if VERIFY { + verify_unlock_conditions(&unlock_conditions, &anchor_id).map_err(UnpackError::Packable)?; + } + + let features = Features::unpack::<_, VERIFY>(unpacker, &())?; + + if VERIFY { + verify_allowed_features(&features, Self::ALLOWED_FEATURES).map_err(UnpackError::Packable)?; + } + + let immutable_features = Features::unpack::<_, VERIFY>(unpacker, &())?; + + if VERIFY { + verify_allowed_features(&immutable_features, Self::ALLOWED_IMMUTABLE_FEATURES) + .map_err(UnpackError::Packable)?; + } + + Ok(Self { + amount, + mana, + native_tokens, + anchor_id, + state_index, + state_metadata, + unlock_conditions, + features, + immutable_features, + }) + } +} + +#[inline] +fn verify_index_counter(anchor_id: &AnchorId, state_index: u32) -> Result<(), Error> { + if anchor_id.is_null() && state_index != 0 { + Err(Error::NonZeroStateIndexOrFoundryCounter) + } else { + Ok(()) + } +} + +fn verify_unlock_conditions(unlock_conditions: &UnlockConditions, anchor_id: &AnchorId) -> Result<(), Error> { + if let Some(unlock_condition) = unlock_conditions.state_controller_address() { + if let Address::Anchor(anchor_address) = unlock_condition.address() { + if anchor_address.anchor_id() == anchor_id { + return Err(Error::SelfControlledAnchorOutput(*anchor_id)); + } + } + } else { + return Err(Error::MissingStateControllerUnlockCondition); + } + + if let Some(unlock_condition) = unlock_conditions.governor_address() { + if let Address::Anchor(anchor_address) = unlock_condition.address() { + if anchor_address.anchor_id() == anchor_id { + return Err(Error::SelfControlledAnchorOutput(*anchor_id)); + } + } + } else { + return Err(Error::MissingGovernorUnlockCondition); + } + + verify_allowed_unlock_conditions(unlock_conditions, AnchorOutput::ALLOWED_UNLOCK_CONDITIONS) +} + +#[cfg(feature = "serde")] +pub(crate) mod dto { + use alloc::boxed::Box; + + use serde::{Deserialize, Serialize}; + + use super::*; + use crate::{ + types::{ + block::{output::unlock_condition::dto::UnlockConditionDto, Error}, + TryFromDto, + }, + utils::serde::{prefix_hex_bytes, string}, + }; + + /// Describes an anchor in the ledger that can be controlled by the state and governance controllers. + #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] + pub struct AnchorOutputDto { + #[serde(rename = "type")] + pub kind: u8, + #[serde(with = "string")] + pub amount: u64, + #[serde(with = "string")] + pub mana: u64, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub native_tokens: Vec, + pub anchor_id: AnchorId, + pub state_index: u32, + #[serde(skip_serializing_if = "<[_]>::is_empty", default, with = "prefix_hex_bytes")] + pub state_metadata: Box<[u8]>, + pub unlock_conditions: Vec, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub features: Vec, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub immutable_features: Vec, + } + + impl From<&AnchorOutput> for AnchorOutputDto { + fn from(value: &AnchorOutput) -> Self { + Self { + kind: AnchorOutput::KIND, + amount: value.amount(), + mana: value.mana(), + native_tokens: value.native_tokens().to_vec(), + anchor_id: *value.anchor_id(), + state_index: value.state_index(), + state_metadata: value.state_metadata().into(), + unlock_conditions: value.unlock_conditions().iter().map(Into::into).collect::<_>(), + features: value.features().to_vec(), + immutable_features: value.immutable_features().to_vec(), + } + } + } + + impl TryFromDto for AnchorOutput { + type Dto = AnchorOutputDto; + type Error = Error; + + fn try_from_dto_with_params_inner(dto: Self::Dto, params: ValidationParams<'_>) -> Result { + let mut builder = AnchorOutputBuilder::new_with_amount(dto.amount, dto.anchor_id) + .with_mana(dto.mana) + .with_state_index(dto.state_index) + .with_native_tokens(dto.native_tokens) + .with_features(dto.features) + .with_immutable_features(dto.immutable_features) + .with_state_metadata(dto.state_metadata); + + for u in dto.unlock_conditions { + builder = builder.add_unlock_condition(UnlockCondition::try_from_dto_with_params(u, ¶ms)?); + } + + builder.finish_with_params(params) + } + } + + impl AnchorOutput { + #[allow(clippy::too_many_arguments)] + pub fn try_from_dtos<'a>( + amount: OutputBuilderAmount, + mana: u64, + native_tokens: Option>, + anchor_id: &AnchorId, + state_index: Option, + state_metadata: Option>, + unlock_conditions: Vec, + features: Option>, + immutable_features: Option>, + params: impl Into> + Send, + ) -> Result { + let params = params.into(); + let mut builder = match amount { + OutputBuilderAmount::Amount(amount) => AnchorOutputBuilder::new_with_amount(amount, *anchor_id), + OutputBuilderAmount::MinimumStorageDeposit(rent_structure) => { + AnchorOutputBuilder::new_with_minimum_storage_deposit(rent_structure, *anchor_id) + } + } + .with_mana(mana); + + if let Some(native_tokens) = native_tokens { + builder = builder.with_native_tokens(native_tokens); + } + + if let Some(state_index) = state_index { + builder = builder.with_state_index(state_index); + } + + if let Some(state_metadata) = state_metadata { + builder = builder.with_state_metadata(state_metadata); + } + + let unlock_conditions = unlock_conditions + .into_iter() + .map(|u| UnlockCondition::try_from_dto_with_params(u, ¶ms)) + .collect::, Error>>()?; + builder = builder.with_unlock_conditions(unlock_conditions); + + if let Some(features) = features { + builder = builder.with_features(features); + } + + if let Some(immutable_features) = immutable_features { + builder = builder.with_immutable_features(immutable_features); + } + + builder.finish_with_params(params) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::types::{ + block::{ + output::dto::OutputDto, + protocol::protocol_parameters, + rand::output::{ + feature::rand_allowed_features, + rand_anchor_id, rand_anchor_output, + unlock_condition::{ + rand_governor_address_unlock_condition_different_from, + rand_state_controller_address_unlock_condition_different_from, + }, + }, + }, + TryFromDto, + }; + + #[test] + fn to_from_dto() { + let protocol_parameters = protocol_parameters(); + let output = rand_anchor_output(protocol_parameters.token_supply()); + let dto = OutputDto::Anchor((&output).into()); + let output_unver = Output::try_from_dto(dto.clone()).unwrap(); + assert_eq!(&output, output_unver.as_anchor()); + let output_ver = Output::try_from_dto_with_params(dto, &protocol_parameters).unwrap(); + assert_eq!(&output, output_ver.as_anchor()); + + let output_split = AnchorOutput::try_from_dtos( + OutputBuilderAmount::Amount(output.amount()), + output.mana(), + Some(output.native_tokens().to_vec()), + output.anchor_id(), + output.state_index().into(), + output.state_metadata().to_owned().into(), + output.unlock_conditions().iter().map(Into::into).collect(), + Some(output.features().to_vec()), + Some(output.immutable_features().to_vec()), + &protocol_parameters, + ) + .unwrap(); + assert_eq!(output, output_split); + + let anchor_id = rand_anchor_id(); + let gov_address = rand_governor_address_unlock_condition_different_from(&anchor_id); + let state_address = rand_state_controller_address_unlock_condition_different_from(&anchor_id); + + let test_split_dto = |builder: AnchorOutputBuilder| { + let output_split = AnchorOutput::try_from_dtos( + builder.amount, + builder.mana, + Some(builder.native_tokens.iter().copied().collect()), + &builder.anchor_id, + builder.state_index, + builder.state_metadata.to_owned().into(), + builder.unlock_conditions.iter().map(Into::into).collect(), + Some(builder.features.iter().cloned().collect()), + Some(builder.immutable_features.iter().cloned().collect()), + &protocol_parameters, + ) + .unwrap(); + assert_eq!(builder.finish_with_params(&protocol_parameters).unwrap(), output_split); + }; + + let builder = AnchorOutput::build_with_amount(100, anchor_id) + .add_unlock_condition(gov_address.clone()) + .add_unlock_condition(state_address.clone()) + .with_features(rand_allowed_features(AnchorOutput::ALLOWED_FEATURES)) + .with_immutable_features(rand_allowed_features(AnchorOutput::ALLOWED_IMMUTABLE_FEATURES)); + test_split_dto(builder); + + let builder = AnchorOutput::build_with_minimum_storage_deposit(protocol_parameters.rent_structure(), anchor_id) + .add_unlock_condition(gov_address) + .add_unlock_condition(state_address) + .with_features(rand_allowed_features(AnchorOutput::ALLOWED_FEATURES)) + .with_immutable_features(rand_allowed_features(AnchorOutput::ALLOWED_IMMUTABLE_FEATURES)); + test_split_dto(builder); + } +} diff --git a/sdk/src/types/block/output/chain_id.rs b/sdk/src/types/block/output/chain_id.rs index a3159a0ae3..b5eb24debc 100644 --- a/sdk/src/types/block/output/chain_id.rs +++ b/sdk/src/types/block/output/chain_id.rs @@ -3,7 +3,7 @@ use derive_more::From; -use crate::types::block::output::{AccountId, DelegationId, FoundryId, NftId, OutputId}; +use crate::types::block::output::{AccountId, AnchorId, DelegationId, FoundryId, NftId, OutputId}; /// #[derive(Clone, Copy, Eq, Hash, PartialEq, Ord, PartialOrd, From)] @@ -17,6 +17,8 @@ pub enum ChainId { Nft(NftId), /// Delegation(DelegationId), + /// + Anchor(AnchorId), } impl core::fmt::Debug for ChainId { @@ -27,6 +29,7 @@ impl core::fmt::Debug for ChainId { Self::Foundry(id) => formatter.field(id), Self::Nft(id) => formatter.field(id), Self::Delegation(id) => formatter.field(id), + Self::Anchor(id) => formatter.field(id), }; formatter.finish() } @@ -40,6 +43,7 @@ impl ChainId { Self::Foundry(id) => id.is_null(), Self::Nft(id) => id.is_null(), Self::Delegation(id) => id.is_null(), + Self::Anchor(id) => id.is_null(), } } @@ -54,6 +58,7 @@ impl ChainId { Self::Foundry(_) => self, Self::Nft(_) => Self::Nft(NftId::from(output_id)), Self::Delegation(_) => Self::Delegation(DelegationId::from(output_id)), + Self::Anchor(_) => Self::Anchor(AnchorId::from(output_id)), } } } @@ -65,6 +70,7 @@ impl core::fmt::Display for ChainId { Self::Foundry(id) => write!(f, "{id}"), Self::Nft(id) => write!(f, "{id}"), Self::Delegation(id) => write!(f, "{id}"), + Self::Anchor(id) => write!(f, "{id}"), } } } diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index 01dff5900f..3448884b33 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -1,6 +1,7 @@ // Copyright 2020-2021 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +mod anchor; mod chain_id; mod delegation; mod metadata; @@ -41,7 +42,8 @@ pub(crate) use self::{ unlock_condition::AddressUnlockCondition, }; pub use self::{ - account::{AccountId, AccountOutput, AccountOutputBuilder, AccountTransition}, + account::{AccountId, AccountOutput, AccountOutputBuilder}, + anchor::{AnchorId, AnchorOutput, AnchorTransition}, basic::{BasicOutput, BasicOutputBuilder}, chain_id::ChainId, delegation::{DelegationId, DelegationOutput, DelegationOutputBuilder}, @@ -121,6 +123,8 @@ pub enum Output { Nft(NftOutput), /// A delegation output. Delegation(DelegationOutput), + /// An anchor output. + Anchor(AnchorOutput), } impl core::fmt::Debug for Output { @@ -131,6 +135,7 @@ impl core::fmt::Debug for Output { Self::Foundry(output) => output.fmt(f), Self::Nft(output) => output.fmt(f), Self::Delegation(output) => output.fmt(f), + Self::Anchor(output) => output.fmt(f), } } } @@ -147,6 +152,7 @@ impl Output { Self::Foundry(_) => FoundryOutput::KIND, Self::Nft(_) => NftOutput::KIND, Self::Delegation(_) => DelegationOutput::KIND, + Self::Anchor(_) => AnchorOutput::KIND, } } @@ -158,6 +164,7 @@ impl Output { Self::Foundry(_) => "Foundry", Self::Nft(_) => "Nft", Self::Delegation(_) => "Delegation", + Self::Anchor(_) => "Anchor", } } @@ -169,6 +176,7 @@ impl Output { Self::Foundry(output) => output.amount(), Self::Nft(output) => output.amount(), Self::Delegation(output) => output.amount(), + Self::Anchor(output) => output.amount(), } } @@ -180,6 +188,7 @@ impl Output { Self::Foundry(_) => 0, Self::Nft(output) => output.mana(), Self::Delegation(_) => 0, + Self::Anchor(output) => output.mana(), } } @@ -191,6 +200,7 @@ impl Output { Self::Foundry(output) => Some(output.native_tokens()), Self::Nft(output) => Some(output.native_tokens()), Self::Delegation(_) => None, + Self::Anchor(output) => Some(output.native_tokens()), } } @@ -202,6 +212,7 @@ impl Output { Self::Foundry(output) => Some(output.unlock_conditions()), Self::Nft(output) => Some(output.unlock_conditions()), Self::Delegation(output) => Some(output.unlock_conditions()), + Self::Anchor(output) => Some(output.unlock_conditions()), } } @@ -213,6 +224,7 @@ impl Output { Self::Foundry(output) => Some(output.features()), Self::Nft(output) => Some(output.features()), Self::Delegation(_) => None, + Self::Anchor(output) => Some(output.features()), } } @@ -224,6 +236,7 @@ impl Output { Self::Foundry(output) => Some(output.immutable_features()), Self::Nft(output) => Some(output.immutable_features()), Self::Delegation(_) => None, + Self::Anchor(output) => Some(output.immutable_features()), } } @@ -235,10 +248,11 @@ impl Output { Self::Foundry(output) => Some(output.chain_id()), Self::Nft(output) => Some(output.chain_id()), Self::Delegation(_) => None, + Self::Anchor(output) => Some(output.chain_id()), } } - crate::def_is_as_opt!(Output: Basic, Account, Foundry, Nft, Delegation); + crate::def_is_as_opt!(Output: Basic, Account, Foundry, Nft, Delegation, Anchor); /// Returns the address that is required to unlock this [`Output`] and the account or nft address that gets /// unlocked by it, if it's an account or nft. @@ -247,7 +261,6 @@ impl Output { &self, slot_index: SlotIndex, output_id: &OutputId, - account_transition: Option, ) -> Result<(Address, Option
), Error> { match self { Self::Basic(output) => Ok(( @@ -257,17 +270,13 @@ impl Output { .clone(), None, )), - Self::Account(output) => { - if account_transition.unwrap_or(AccountTransition::State) == AccountTransition::State { - // Account address is only unlocked if it's a state transition - Ok(( - output.state_controller_address().clone(), - Some(Address::Account(output.account_address(output_id))), - )) - } else { - Ok((output.governor_address().clone(), None)) - } - } + Self::Account(output) => Ok(( + output + .unlock_conditions() + .locked_address(output.address(), slot_index) + .clone(), + Some(Address::Account(output.account_address(output_id))), + )), Self::Foundry(output) => Ok((Address::Account(*output.account_address()), None)), Self::Nft(output) => Ok(( output @@ -283,6 +292,7 @@ impl Output { .clone(), None, )), + Self::Anchor(_) => Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), } } @@ -393,6 +403,10 @@ impl Packable for Output { DelegationOutput::KIND.pack(packer)?; output.pack(packer) } + Self::Anchor(output) => { + AnchorOutput::KIND.pack(packer)?; + output.pack(packer) + } }?; Ok(()) @@ -408,6 +422,7 @@ impl Packable for Output { FoundryOutput::KIND => Self::from(FoundryOutput::unpack::<_, VERIFY>(unpacker, visitor).coerce()?), NftOutput::KIND => Self::from(NftOutput::unpack::<_, VERIFY>(unpacker, visitor).coerce()?), DelegationOutput::KIND => Self::from(DelegationOutput::unpack::<_, VERIFY>(unpacker, visitor).coerce()?), + AnchorOutput::KIND => Self::from(AnchorOutput::unpack::<_, VERIFY>(unpacker, visitor).coerce()?), k => return Err(UnpackError::Packable(Error::InvalidOutputKind(k))), }) } @@ -471,8 +486,8 @@ pub mod dto { use super::*; pub use super::{ - account::dto::AccountOutputDto, basic::dto::BasicOutputDto, delegation::dto::DelegationOutputDto, - foundry::dto::FoundryOutputDto, nft::dto::NftOutputDto, + account::dto::AccountOutputDto, anchor::dto::AnchorOutputDto, basic::dto::BasicOutputDto, + delegation::dto::DelegationOutputDto, foundry::dto::FoundryOutputDto, nft::dto::NftOutputDto, }; use crate::types::{block::Error, TryFromDto, ValidationParams}; @@ -484,6 +499,7 @@ pub mod dto { Foundry(FoundryOutputDto), Nft(NftOutputDto), Delegation(DelegationOutputDto), + Anchor(AnchorOutputDto), } impl From<&Output> for OutputDto { @@ -494,6 +510,7 @@ pub mod dto { Output::Foundry(o) => Self::Foundry(o.into()), Output::Nft(o) => Self::Nft(o.into()), Output::Delegation(o) => Self::Delegation(o.into()), + Output::Anchor(o) => Self::Anchor(o.into()), } } } @@ -511,6 +528,7 @@ pub mod dto { OutputDto::Delegation(o) => { Self::Delegation(DelegationOutput::try_from_dto_with_params_inner(o, params)?) } + OutputDto::Anchor(o) => Self::Anchor(AnchorOutput::try_from_dto_with_params_inner(o, params)?), }) } } @@ -545,6 +563,10 @@ pub mod dto { serde::de::Error::custom(format!("cannot deserialize delegation output: {e}")) })?) } + AnchorOutput::KIND => Self::Anchor( + AnchorOutputDto::deserialize(value) + .map_err(|e| serde::de::Error::custom(format!("cannot deserialize anchor output: {e}")))?, + ), _ => return Err(serde::de::Error::custom("invalid output type")), }, ) @@ -564,6 +586,7 @@ pub mod dto { T2(&'a FoundryOutputDto), T3(&'a NftOutputDto), T4(&'a DelegationOutputDto), + T5(&'a AnchorOutputDto), } #[derive(Serialize)] struct TypedOutput<'a> { @@ -586,6 +609,9 @@ pub mod dto { Self::Delegation(o) => TypedOutput { output: OutputDto_::T4(o), }, + Self::Anchor(o) => TypedOutput { + output: OutputDto_::T5(o), + }, }; output.serialize(serializer) } diff --git a/sdk/src/types/block/output/unlock_condition/governor_address.rs b/sdk/src/types/block/output/unlock_condition/governor_address.rs index c4fc579d85..e2c351e5cc 100644 --- a/sdk/src/types/block/output/unlock_condition/governor_address.rs +++ b/sdk/src/types/block/output/unlock_condition/governor_address.rs @@ -6,7 +6,7 @@ use derive_more::From; use crate::types::block::address::Address; /// Defines the Governor Address that owns this output, that is, it can unlock it with the proper Unlock in a -/// transaction that governance transitions the account output. +/// transaction that governance transitions the anchor output. #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, From, packable::Packable)] pub struct GovernorAddressUnlockCondition(Address); diff --git a/sdk/src/types/block/output/unlock_condition/state_controller_address.rs b/sdk/src/types/block/output/unlock_condition/state_controller_address.rs index baee96b9ff..759a55f3f6 100644 --- a/sdk/src/types/block/output/unlock_condition/state_controller_address.rs +++ b/sdk/src/types/block/output/unlock_condition/state_controller_address.rs @@ -6,7 +6,7 @@ use derive_more::From; use crate::types::block::address::Address; /// Defines the State Controller Address that owns this output, that is, it can unlock it with the proper Unlock in a -/// transaction that state transitions the account output. +/// transaction that state transitions the anchor output. #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, From, packable::Packable)] pub struct StateControllerAddressUnlockCondition(Address); diff --git a/sdk/src/types/block/payload/signed_transaction/transaction.rs b/sdk/src/types/block/payload/signed_transaction/transaction.rs index 912c445020..a02b2e3629 100644 --- a/sdk/src/types/block/payload/signed_transaction/transaction.rs +++ b/sdk/src/types/block/payload/signed_transaction/transaction.rs @@ -435,6 +435,7 @@ fn verify_outputs(outputs: &[Output], visitor: &ProtocolPara Output::Foundry(output) => (output.amount(), Some(output.native_tokens()), Some(output.chain_id())), Output::Nft(output) => (output.amount(), Some(output.native_tokens()), Some(output.chain_id())), Output::Delegation(output) => (output.amount(), None, Some(output.chain_id())), + Output::Anchor(output) => (output.amount(), None, Some(output.chain_id())), }; amount_sum = amount_sum @@ -475,6 +476,7 @@ pub enum TransactionCapabilityFlag { BurnNativeTokens, BurnMana, DestroyAccountOutputs, + DestroyAnchorOutputs, DestroyFoundryOutputs, DestroyNftOutputs, } @@ -483,18 +485,20 @@ impl TransactionCapabilityFlag { const BURN_NATIVE_TOKENS: u8 = 0b00000001; const BURN_MANA: u8 = 0b00000010; const DESTROY_ACCOUNT_OUTPUTS: u8 = 0b00000100; - const DESTROY_FOUNDRY_OUTPUTS: u8 = 0b00001000; - const DESTROY_NFT_OUTPUTS: u8 = 0b00010000; + const DESTROY_ANCHOR_OUTPUTS: u8 = 0b00001000; + const DESTROY_FOUNDRY_OUTPUTS: u8 = 0b00010000; + const DESTROY_NFT_OUTPUTS: u8 = 0b00100000; } impl CapabilityFlag for TransactionCapabilityFlag { - type Iterator = core::array::IntoIter; + type Iterator = core::array::IntoIter; fn as_byte(&self) -> u8 { match self { Self::BurnNativeTokens => Self::BURN_NATIVE_TOKENS, Self::BurnMana => Self::BURN_MANA, Self::DestroyAccountOutputs => Self::DESTROY_ACCOUNT_OUTPUTS, + Self::DestroyAnchorOutputs => Self::DESTROY_ANCHOR_OUTPUTS, Self::DestroyFoundryOutputs => Self::DESTROY_FOUNDRY_OUTPUTS, Self::DestroyNftOutputs => Self::DESTROY_NFT_OUTPUTS, } @@ -505,6 +509,7 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::BurnNativeTokens | Self::BurnMana | Self::DestroyAccountOutputs + | Self::DestroyAnchorOutputs | Self::DestroyFoundryOutputs | Self::DestroyNftOutputs => 0, } @@ -515,6 +520,7 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::BurnNativeTokens, Self::BurnMana, Self::DestroyAccountOutputs, + Self::DestroyAnchorOutputs, Self::DestroyFoundryOutputs, Self::DestroyNftOutputs, ] diff --git a/sdk/src/types/block/rand/address.rs b/sdk/src/types/block/rand/address.rs index fcb4a79c67..60e0125ca3 100644 --- a/sdk/src/types/block/rand/address.rs +++ b/sdk/src/types/block/rand/address.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::types::block::{ - address::{AccountAddress, Address, Ed25519Address, NftAddress}, - output::{AccountId, NftId}, + address::{AccountAddress, Address, AnchorAddress, Ed25519Address, NftAddress}, + output::{AccountId, AnchorId, NftId}, rand::{bytes::rand_bytes_array, number::rand_number}, }; @@ -22,12 +22,19 @@ pub fn rand_nft_address() -> NftAddress { NftAddress::new(NftId::from(rand_bytes_array())) } +/// Generates a random anchor address. +pub fn rand_anchor_address() -> AnchorAddress { + AnchorAddress::new(AnchorId::from(rand_bytes_array())) +} + +// TODO handle all address kinds /// Generates a random address. pub fn rand_address() -> Address { - match rand_number::() % 3 { + match rand_number::() % 4 { 0 => rand_ed25519_address().into(), 1 => rand_account_address().into(), 2 => rand_nft_address().into(), + 3 => rand_anchor_address().into(), _ => unreachable!(), } } diff --git a/sdk/src/types/block/rand/output/mod.rs b/sdk/src/types/block/rand/output/mod.rs index 5b8f75effb..f4d613f8ad 100644 --- a/sdk/src/types/block/rand/output/mod.rs +++ b/sdk/src/types/block/rand/output/mod.rs @@ -13,8 +13,9 @@ use primitive_types::U256; pub use self::metadata::rand_output_metadata; use crate::types::block::{ output::{ - unlock_condition::ImmutableAccountAddressUnlockCondition, AccountId, AccountOutput, BasicOutput, FoundryOutput, - NftId, NftOutput, Output, OutputId, SimpleTokenScheme, TokenScheme, OUTPUT_INDEX_RANGE, + unlock_condition::ImmutableAccountAddressUnlockCondition, AccountId, AccountOutput, AnchorId, AnchorOutput, + BasicOutput, FoundryOutput, NftId, NftOutput, Output, OutputId, SimpleTokenScheme, TokenScheme, + OUTPUT_INDEX_RANGE, }, rand::{ address::rand_account_address, @@ -24,6 +25,7 @@ use crate::types::block::{ feature::rand_allowed_features, unlock_condition::{ rand_address_unlock_condition, rand_address_unlock_condition_different_from, + rand_address_unlock_condition_different_from_account_id, rand_governor_address_unlock_condition_different_from, rand_state_controller_address_unlock_condition_different_from, }, @@ -52,6 +54,11 @@ pub fn rand_account_id() -> AccountId { AccountId::from(rand_bytes_array()) } +/// Generates a random [`AnchorId`](AnchorId). +pub fn rand_anchor_id() -> AnchorId { + AnchorId::from(rand_bytes_array()) +} + /// Generates a random [`AccountOutput`](AccountOutput). pub fn rand_account_output(token_supply: u64) -> AccountOutput { // We need to make sure that `AccountId` and `Address` don't match. @@ -59,10 +66,25 @@ pub fn rand_account_output(token_supply: u64) -> AccountOutput { AccountOutput::build_with_amount(rand_number_range(Output::AMOUNT_MIN..token_supply), account_id) .with_features(rand_allowed_features(AccountOutput::ALLOWED_FEATURES)) + .add_unlock_condition(rand_address_unlock_condition_different_from_account_id(&account_id)) + .finish_with_params(token_supply) + .unwrap() +} + +/// Generates a random [`AnchorOutput`](AnchorOutput). +pub fn rand_anchor_output(token_supply: u64) -> AnchorOutput { + // We need to make sure that `AnchorId` and `Address` don't match. + let anchor_id = rand_anchor_id(); + + AnchorOutput::build_with_amount(rand_number_range(Output::AMOUNT_MIN..token_supply), anchor_id) + .with_features(rand_allowed_features(AnchorOutput::ALLOWED_FEATURES)) + .add_unlock_condition(rand_state_controller_address_unlock_condition_different_from( + &anchor_id, + )) + .add_unlock_condition(rand_governor_address_unlock_condition_different_from(&anchor_id)) .add_unlock_condition(rand_state_controller_address_unlock_condition_different_from( - &account_id, + &anchor_id, )) - .add_unlock_condition(rand_governor_address_unlock_condition_different_from(&account_id)) .finish_with_params(token_supply) .unwrap() } diff --git a/sdk/src/types/block/rand/output/unlock_condition.rs b/sdk/src/types/block/rand/output/unlock_condition.rs index 992500d3bb..05f0982848 100644 --- a/sdk/src/types/block/rand/output/unlock_condition.rs +++ b/sdk/src/types/block/rand/output/unlock_condition.rs @@ -7,9 +7,9 @@ use crate::types::block::{ unlock_condition::{ AddressUnlockCondition, GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition, }, - AccountId, NftId, + AccountId, AnchorId, NftId, }, - rand::address::{rand_account_address, rand_address, rand_nft_address}, + rand::address::{rand_account_address, rand_address, rand_anchor_address, rand_nft_address}, }; /// Generates a random [`AddressUnlockCondition`]. @@ -17,23 +17,36 @@ pub fn rand_address_unlock_condition() -> AddressUnlockCondition { rand_address().into() } -/// Generates a random [`StateControllerAddressUnlockCondition`]. +/// Generates a random [`StateControllerAddressUnlockCondition`] that is different from `anchor_id`. pub fn rand_state_controller_address_unlock_condition_different_from( - account_id: &AccountId, + anchor_id: &AnchorId, ) -> StateControllerAddressUnlockCondition { let mut address = rand_address(); - if let Address::Account(mut account_address) = &mut address { - while account_address.account_id() == account_id { - account_address = rand_account_address(); + if let Address::Anchor(mut account_address) = &mut address { + while account_address.anchor_id() == anchor_id { + account_address = rand_anchor_address(); + } + } + + address.into() +} + +/// Generates a random [`GovernorAddressUnlockCondition`] that is different from `anchor_id`. +pub fn rand_governor_address_unlock_condition_different_from(anchor_id: &AnchorId) -> GovernorAddressUnlockCondition { + let mut address = rand_address(); + + if let Address::Anchor(mut account_address) = &mut address { + while account_address.anchor_id() == anchor_id { + account_address = rand_anchor_address(); } } address.into() } -/// Generates a random [`GovernorAddressUnlockCondition`] that is different from `account_id`. -pub fn rand_governor_address_unlock_condition_different_from(account_id: &AccountId) -> GovernorAddressUnlockCondition { +/// Generates a random [`AddressUnlockCondition`] that is different from `account_id`. +pub fn rand_address_unlock_condition_different_from_account_id(account_id: &AccountId) -> AddressUnlockCondition { let mut address = rand_address(); if let Address::Account(mut account_address) = &mut address { diff --git a/sdk/src/types/block/semantic.rs b/sdk/src/types/block/semantic.rs index d6f6240501..bd5a8b1cb8 100644 --- a/sdk/src/types/block/semantic.rs +++ b/sdk/src/types/block/semantic.rs @@ -9,7 +9,7 @@ use primitive_types::U256; use crate::types::block::{ address::{Address, AddressCapabilityFlag}, - output::{ChainId, FoundryId, NativeTokens, Output, OutputId, TokenId, UnlockCondition}, + output::{AnchorOutput, ChainId, FoundryId, NativeTokens, Output, OutputId, TokenId, UnlockCondition}, payload::signed_transaction::{Transaction, TransactionCapabilityFlag, TransactionId, TransactionSigningHash}, unlock::Unlocks, Error, @@ -251,6 +251,7 @@ impl<'a> SemanticValidationContext<'a> { None, output.unlock_conditions(), ), + Output::Anchor(_) => return Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), }; if let Err(conflict) = conflict { @@ -330,6 +331,7 @@ impl<'a> SemanticValidationContext<'a> { Some(output.features()), ), Output::Delegation(output) => (output.amount(), 0, None, None), + Output::Anchor(_) => return Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), }; if let Some(unlock_conditions) = created_output.unlock_conditions() { @@ -382,6 +384,7 @@ impl<'a> SemanticValidationContext<'a> { Output::Account(_) => !address.has_capability(AddressCapabilityFlag::AccountOutputs), Output::Nft(_) => !address.has_capability(AddressCapabilityFlag::NftOutputs), Output::Delegation(_) => !address.has_capability(AddressCapabilityFlag::DelegationOutputs), + Output::Anchor(_) => !address.has_capability(AddressCapabilityFlag::AnchorOutputs), _ => false, } { // TODO: add a variant https://github.com/iotaledger/iota-sdk/issues/1430 diff --git a/sdk/src/types/block/unlock/anchor.rs b/sdk/src/types/block/unlock/anchor.rs new file mode 100644 index 0000000000..21073c48d4 --- /dev/null +++ b/sdk/src/types/block/unlock/anchor.rs @@ -0,0 +1,70 @@ +// Copyright 2023 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use crate::types::block::{unlock::UnlockIndex, Error}; + +/// Points to the unlock of a consumed anchor output. +#[derive(Clone, Debug, Eq, PartialEq, Hash, packable::Packable)] +#[packable(unpack_error = Error, with = Error::InvalidAnchorIndex)] +pub struct AnchorUnlock( + /// Index of input and unlock corresponding to an [`AnchorOutput`](crate::types::block::output::AnchorOutput). + UnlockIndex, +); + +impl TryFrom for AnchorUnlock { + type Error = Error; + + fn try_from(index: u16) -> Result { + Self::new(index) + } +} + +impl AnchorUnlock { + /// The [`Unlock`](crate::types::block::unlock::Unlock) kind of an [`AnchorUnlock`]. + pub const KIND: u8 = 4; + + /// Creates a new [`AnchorUnlock`]. + #[inline(always)] + pub fn new(index: u16) -> Result { + index.try_into().map(Self).map_err(Error::InvalidAnchorIndex) + } + + /// Return the index of an [`AnchorUnlock`]. + #[inline(always)] + pub fn index(&self) -> u16 { + self.0.get() + } +} + +mod dto { + use serde::{Deserialize, Serialize}; + + use super::*; + + #[derive(Serialize, Deserialize)] + struct AnchorUnlockDto { + #[serde(rename = "type")] + kind: u8, + #[serde(rename = "reference")] + index: u16, + } + + impl From<&AnchorUnlock> for AnchorUnlockDto { + fn from(value: &AnchorUnlock) -> Self { + Self { + kind: AnchorUnlock::KIND, + index: value.0.get(), + } + } + } + + impl TryFrom for AnchorUnlock { + type Error = Error; + + fn try_from(value: AnchorUnlockDto) -> Result { + Self::new(value.index) + } + } + + crate::impl_serde_typed_dto!(AnchorUnlock, AnchorUnlockDto, "anchor unlock"); +} diff --git a/sdk/src/types/block/unlock/mod.rs b/sdk/src/types/block/unlock/mod.rs index 9499fe3800..559c60a341 100644 --- a/sdk/src/types/block/unlock/mod.rs +++ b/sdk/src/types/block/unlock/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 mod account; +mod anchor; mod nft; mod reference; mod signature; @@ -13,7 +14,10 @@ use derive_more::{Deref, From}; use hashbrown::HashSet; use packable::{bounded::BoundedU16, prefix::BoxedSlicePrefix, Packable}; -pub use self::{account::AccountUnlock, nft::NftUnlock, reference::ReferenceUnlock, signature::SignatureUnlock}; +pub use self::{ + account::AccountUnlock, anchor::AnchorUnlock, nft::NftUnlock, reference::ReferenceUnlock, + signature::SignatureUnlock, +}; use crate::types::block::{ input::{INPUT_COUNT_MAX, INPUT_COUNT_RANGE, INPUT_INDEX_MAX}, Error, @@ -49,6 +53,9 @@ pub enum Unlock { /// An NFT unlock. #[packable(tag = NftUnlock::KIND)] Nft(NftUnlock), + /// An Anchor unlock. + #[packable(tag = AnchorUnlock::KIND)] + Anchor(AnchorUnlock), } impl From for Unlock { @@ -64,6 +71,7 @@ impl core::fmt::Debug for Unlock { Self::Reference(unlock) => unlock.fmt(f), Self::Account(unlock) => unlock.fmt(f), Self::Nft(unlock) => unlock.fmt(f), + Self::Anchor(unlock) => unlock.fmt(f), } } } @@ -76,6 +84,7 @@ impl Unlock { Self::Reference(_) => ReferenceUnlock::KIND, Self::Account(_) => AccountUnlock::KIND, Self::Nft(_) => NftUnlock::KIND, + Self::Anchor(_) => AnchorUnlock::KIND, } } @@ -140,6 +149,11 @@ fn verify_unlocks(unlocks: &[Unlock], _: &()) -> Result<(), return Err(Error::InvalidUnlockNft(index)); } } + Unlock::Anchor(anchor) => { + if index == 0 || anchor.index() >= index { + return Err(Error::InvalidUnlockAnchor(index)); + } + } } } } diff --git a/sdk/src/wallet/account/operations/helpers/time.rs b/sdk/src/wallet/account/operations/helpers/time.rs index 271b42929d..7bf893f45a 100644 --- a/sdk/src/wallet/account/operations/helpers/time.rs +++ b/sdk/src/wallet/account/operations/helpers/time.rs @@ -2,11 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - types::block::{ - address::Address, - output::{AccountTransition, Output}, - slot::SlotIndex, - }, + types::block::{address::Address, output::Output, slot::SlotIndex}, wallet::account::types::{AddressWithUnspentOutputs, OutputData}, }; @@ -19,7 +15,6 @@ pub(crate) fn can_output_be_unlocked_now( account_and_nft_addresses: &[Address], output_data: &OutputData, slot_index: SlotIndex, - account_transition: Option, ) -> crate::wallet::Result { if let Some(unlock_conditions) = output_data.output.unlock_conditions() { if unlock_conditions.is_time_locked(slot_index) { @@ -29,7 +24,7 @@ pub(crate) fn can_output_be_unlocked_now( let (required_unlock_address, _unlocked_account_or_nft_address) = output_data .output - .required_and_unlocked_address(slot_index, &output_data.output_id, account_transition)?; + .required_and_unlocked_address(slot_index, &output_data.output_id)?; Ok(account_addresses .iter() diff --git a/sdk/src/wallet/account/operations/output_claiming.rs b/sdk/src/wallet/account/operations/output_claiming.rs index f266f39f63..c3d656b472 100644 --- a/sdk/src/wallet/account/operations/output_claiming.rs +++ b/sdk/src/wallet/account/operations/output_claiming.rs @@ -72,8 +72,6 @@ where &[], output_data, slot_index, - // Not relevant without account addresses - None, )? { match outputs_to_claim { diff --git a/sdk/src/wallet/account/operations/output_consolidation.rs b/sdk/src/wallet/account/operations/output_consolidation.rs index 415ce9424e..6ebf1bdeb9 100644 --- a/sdk/src/wallet/account/operations/output_consolidation.rs +++ b/sdk/src/wallet/account/operations/output_consolidation.rs @@ -98,7 +98,7 @@ where return Ok(false); } - can_output_be_unlocked_now(account_addresses, &[], output_data, slot_index, None)? + can_output_be_unlocked_now(account_addresses, &[], output_data, slot_index)? } else { false }) diff --git a/sdk/src/wallet/account/operations/transaction/high_level/burning_melting/melt_native_token.rs b/sdk/src/wallet/account/operations/transaction/high_level/burning_melting/melt_native_token.rs index bbade12af0..7ade02fbfc 100644 --- a/sdk/src/wallet/account/operations/transaction/high_level/burning_melting/melt_native_token.rs +++ b/sdk/src/wallet/account/operations/transaction/high_level/burning_melting/melt_native_token.rs @@ -62,10 +62,9 @@ where })?; if let Output::Account(account_output) = &existing_account_output_data.output { - // Create the new account output with updated amount and state_index + // Create the new account output with updated amount. let account_output = AccountOutputBuilder::from(account_output) .with_account_id(account_id) - .with_state_index(account_output.state_index() + 1) .finish_output(token_supply)?; let TokenScheme::Simple(token_scheme) = existing_foundry_output.token_scheme(); diff --git a/sdk/src/wallet/account/operations/transaction/high_level/create_account.rs b/sdk/src/wallet/account/operations/transaction/high_level/create_account.rs index c63e6b8994..1eaeca7ca6 100644 --- a/sdk/src/wallet/account/operations/transaction/high_level/create_account.rs +++ b/sdk/src/wallet/account/operations/transaction/high_level/create_account.rs @@ -8,9 +8,7 @@ use crate::{ types::block::{ address::Bech32Address, output::{ - feature::MetadataFeature, - unlock_condition::{GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition}, - AccountId, AccountOutputBuilder, Output, + feature::MetadataFeature, unlock_condition::AddressUnlockCondition, AccountId, AccountOutputBuilder, Output, }, }, utils::serde::option_prefix_hex_bytes, @@ -30,9 +28,6 @@ pub struct CreateAccountParams { /// Account metadata #[serde(default, with = "option_prefix_hex_bytes")] pub metadata: Option>, - /// Account state metadata - #[serde(default, with = "option_prefix_hex_bytes")] - pub state_metadata: Option>, } impl Account @@ -78,7 +73,7 @@ where let rent_structure = self.client().get_rent_structure().await?; let token_supply = self.client().get_token_supply().await?; - let controller_address = match params.as_ref().and_then(|options| options.address.as_ref()) { + let address = match params.as_ref().and_then(|options| options.address.as_ref()) { Some(bech32_address) => { self.client().bech32_hrp_matches(bech32_address.hrp()).await?; bech32_address.inner().clone() @@ -96,14 +91,11 @@ where let mut account_output_builder = AccountOutputBuilder::new_with_minimum_storage_deposit(rent_structure, AccountId::null()) - .with_state_index(0) .with_foundry_counter(0) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(controller_address.clone())) - .add_unlock_condition(GovernorAddressUnlockCondition::new(controller_address)); + .add_unlock_condition(AddressUnlockCondition::new(address.clone())); if let Some(CreateAccountParams { immutable_metadata, metadata, - state_metadata, .. }) = params { @@ -114,9 +106,6 @@ where if let Some(metadata) = metadata { account_output_builder = account_output_builder.add_feature(MetadataFeature::new(metadata)?); } - if let Some(state_metadata) = state_metadata { - account_output_builder = account_output_builder.with_state_metadata(state_metadata); - } } let outputs = [account_output_builder.finish_output(token_supply)?]; @@ -163,7 +152,6 @@ mod tests { address: None, immutable_metadata: None, metadata: None, - state_metadata: None, }; let json_none = serde_json::to_string(¶ms_none_1).unwrap(); let params_none_2 = serde_json::from_str(&json_none).unwrap(); @@ -174,7 +162,6 @@ mod tests { address: None, immutable_metadata: Some(b"immutable_metadata".to_vec()), metadata: Some(b"metadata".to_vec()), - state_metadata: Some(b"state_metadata".to_vec()), }; let json_some = serde_json::to_string(¶ms_some_1).unwrap(); let params_some_2 = serde_json::from_str(&json_some).unwrap(); diff --git a/sdk/src/wallet/account/operations/transaction/high_level/minting/create_native_token.rs b/sdk/src/wallet/account/operations/transaction/high_level/minting/create_native_token.rs index d13aa12412..7daaa703d7 100644 --- a/sdk/src/wallet/account/operations/transaction/high_level/minting/create_native_token.rs +++ b/sdk/src/wallet/account/operations/transaction/high_level/minting/create_native_token.rs @@ -141,10 +141,9 @@ where .ok_or_else(|| crate::wallet::Error::MintingFailed("Missing account output".to_string()))?; if let Output::Account(account_output) = &account_output.output { - // Create the new account output with the same feature blocks, just updated state_index and foundry_counter + // Create the new account output with the same feature blocks, just updated foundry_counter. let new_account_output_builder = AccountOutputBuilder::from(account_output) .with_account_id(account_id) - .with_state_index(account_output.state_index() + 1) .with_foundry_counter(account_output.foundry_counter() + 1); // create foundry output with minted native tokens diff --git a/sdk/src/wallet/account/operations/transaction/high_level/minting/mint_native_token.rs b/sdk/src/wallet/account/operations/transaction/high_level/minting/mint_native_token.rs index 6eb8f230f3..5f3e7f0f83 100644 --- a/sdk/src/wallet/account/operations/transaction/high_level/minting/mint_native_token.rs +++ b/sdk/src/wallet/account/operations/transaction/high_level/minting/mint_native_token.rs @@ -112,9 +112,8 @@ where unreachable!("We checked if it's an foundry output before") }; - // Create the next account output with the same data, just updated state_index - let new_account_output_builder = - AccountOutputBuilder::from(&account_output).with_state_index(account_output.state_index() + 1); + // Create the next account output with the same data. + let new_account_output_builder = AccountOutputBuilder::from(&account_output); // Create next foundry output with minted native tokens diff --git a/sdk/src/wallet/account/operations/transaction/input_selection.rs b/sdk/src/wallet/account/operations/transaction/input_selection.rs index eaef7dc9ac..fb7dd9e0f1 100644 --- a/sdk/src/wallet/account/operations/transaction/input_selection.rs +++ b/sdk/src/wallet/account/operations/transaction/input_selection.rs @@ -7,7 +7,7 @@ use std::collections::{hash_map::Values, HashSet}; use crate::wallet::events::types::{TransactionProgressEvent, WalletEvent}; use crate::{ client::{ - api::input_selection::{is_account_transition, Burn, InputSelection, Selected}, + api::input_selection::{Burn, InputSelection, Selected}, secret::{types::InputSigningData, SecretManage}, }, types::block::{ @@ -76,8 +76,6 @@ where &account_details, account_details.unspent_outputs.values(), slot_index, - &outputs, - burn, custom_inputs.as_ref(), mandatory_inputs.as_ref(), )?; @@ -227,8 +225,6 @@ fn filter_inputs( account: &AccountDetails, available_outputs: Values<'_, OutputId, OutputData>, slot_index: SlotIndex, - outputs: &[Output], - burn: Option<&Burn>, custom_inputs: Option<&HashSet>, mandatory_inputs: Option<&HashSet>, ) -> crate::wallet::Result> { @@ -256,10 +252,7 @@ fn filter_inputs( } } - // Defaults to state transition if it is not explicitly a governance transition or a burn. - let account_state_transition = is_account_transition(&output_data.output, output_data.output_id, outputs, burn); - - if let Some(available_input) = output_data.input_signing_data(account, slot_index, account_state_transition)? { + if let Some(available_input) = output_data.input_signing_data(account, slot_index)? { available_outputs_signing_data.push(available_input); } } diff --git a/sdk/src/wallet/account/types/mod.rs b/sdk/src/wallet/account/types/mod.rs index fa7fca9d01..fbb9edf36a 100644 --- a/sdk/src/wallet/account/types/mod.rs +++ b/sdk/src/wallet/account/types/mod.rs @@ -22,7 +22,7 @@ use crate::{ api::core::OutputWithMetadataResponse, block::{ address::Address, - output::{dto::OutputDto, AccountTransition, Output, OutputId, OutputMetadata}, + output::{dto::OutputDto, Output, OutputId, OutputMetadata}, payload::signed_transaction::{dto::SignedTransactionPayloadDto, SignedTransactionPayload, TransactionId}, slot::SlotIndex, BlockId, Error as BlockError, @@ -57,11 +57,9 @@ impl OutputData { &self, account: &AccountDetails, slot_index: SlotIndex, - account_transition: Option, ) -> crate::wallet::Result> { let (unlock_address, _unlocked_account_or_nft_address) = - self.output - .required_and_unlocked_address(slot_index, &self.output_id, account_transition)?; + self.output.required_and_unlocked_address(slot_index, &self.output_id)?; let chain = if unlock_address == self.address { self.chain diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index 0828b6a389..3a550bfd2a 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -4,18 +4,11 @@ use std::str::FromStr; use iota_sdk::{ - client::{ - api::input_selection::{Burn, Error, InputSelection, Requirement}, - secret::types::InputSigningData, - }, + client::api::input_selection::{Burn, Error, InputSelection, Requirement}, types::block::{ address::Address, - output::{ - unlock_condition::{GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition}, - AccountId, AccountOutputBuilder, AccountTransition, Output, - }, + output::{AccountId, AccountOutputBuilder, Output}, protocol::protocol_parameters, - rand::output::rand_output_metadata, }, }; use pretty_assertions::{assert_eq, assert_ne}; @@ -23,8 +16,8 @@ use pretty_assertions::{assert_eq, assert_ne}; use crate::client::{ addresses, build_inputs, build_outputs, is_remainder_or_return, unsorted_eq, Build::{Account, Basic}, - ACCOUNT_ID_0, ACCOUNT_ID_1, ACCOUNT_ID_2, BECH32_ADDRESS_ACCOUNT_1, BECH32_ADDRESS_ACCOUNT_2, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, BECH32_ADDRESS_ED25519_2, BECH32_ADDRESS_NFT_1, TOKEN_SUPPLY, + ACCOUNT_ID_0, ACCOUNT_ID_1, ACCOUNT_ID_2, BECH32_ADDRESS_ACCOUNT_1, BECH32_ADDRESS_ED25519_0, + BECH32_ADDRESS_ED25519_1, BECH32_ADDRESS_NFT_1, TOKEN_SUPPLY, }; #[test] @@ -35,8 +28,6 @@ fn input_account_eq_output_account() { let inputs = build_inputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -46,8 +37,6 @@ fn input_account_eq_output_account() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -76,8 +65,6 @@ fn transition_account_id_zero() { let inputs = build_inputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -88,8 +75,6 @@ fn transition_account_id_zero() { let outputs = build_outputs([Account( 1_000_000, account_id, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -262,8 +247,6 @@ fn create_account() { let outputs = build_outputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -301,8 +284,6 @@ fn burn_account() { let inputs = build_inputs([Account( 2_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -397,8 +378,6 @@ fn missing_input_for_account_output() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -416,7 +395,7 @@ fn missing_input_for_account_output() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::Governance))) if account_id == account_id_2 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_2 )); } @@ -430,8 +409,6 @@ fn missing_input_for_account_output_2() { Account( 2_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -443,8 +420,6 @@ fn missing_input_for_account_output_2() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -462,7 +437,7 @@ fn missing_input_for_account_output_2() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::Governance))) if account_id == account_id_2 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_2 )); } @@ -484,8 +459,6 @@ fn missing_input_for_account_output_but_created() { let outputs = build_outputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -513,8 +486,6 @@ fn account_in_output_and_sender() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -524,7 +495,6 @@ fn account_in_output_and_sender() { Basic(1_000_000, BECH32_ADDRESS_ED25519_0, None, None, None, None, None, None), ]); let account_output = AccountOutputBuilder::from(inputs[0].output.as_account()) - .with_state_index(inputs[0].output.as_account().state_index() + 1) .finish_output(TOKEN_SUPPLY) .unwrap(); let mut outputs = build_outputs([Basic( @@ -560,8 +530,6 @@ fn missing_ed25519_sender() { let inputs = build_inputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -571,8 +539,6 @@ fn missing_ed25519_sender() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_ED25519_1), @@ -612,8 +578,6 @@ fn missing_ed25519_issuer_created() { let outputs = build_outputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -643,8 +607,6 @@ fn missing_ed25519_issuer_transition() { let inputs = build_inputs([Account( 1_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -654,8 +616,6 @@ fn missing_ed25519_issuer_transition() { let outputs = build_outputs([Account( 1_000_000, account_id_1, - 2, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -682,8 +642,6 @@ fn missing_account_sender() { let inputs = build_inputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -693,8 +651,6 @@ fn missing_account_sender() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_ACCOUNT_1), @@ -734,8 +690,6 @@ fn missing_account_issuer_created() { let outputs = build_outputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -765,8 +719,6 @@ fn missing_account_issuer_transition() { let inputs = build_inputs([Account( 1_000_000, account_id_2, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -776,8 +728,6 @@ fn missing_account_issuer_transition() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -804,8 +754,6 @@ fn missing_nft_sender() { let inputs = build_inputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -815,8 +763,6 @@ fn missing_nft_sender() { let outputs = build_outputs([Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_NFT_1), @@ -856,8 +802,6 @@ fn missing_nft_issuer_created() { let outputs = build_outputs([Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -887,8 +831,6 @@ fn missing_nft_issuer_transition() { let inputs = build_inputs([Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -898,8 +840,6 @@ fn missing_nft_issuer_transition() { let outputs = build_outputs([Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -927,8 +867,6 @@ fn increase_account_amount() { Account( 2_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -940,8 +878,6 @@ fn increase_account_amount() { let outputs = build_outputs([Account( 3_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -971,8 +907,6 @@ fn decrease_account_amount() { Account( 2_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -984,8 +918,6 @@ fn decrease_account_amount() { let outputs = build_outputs([Account( 1_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1027,8 +959,6 @@ fn prefer_basic_to_account() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1071,8 +1001,6 @@ fn take_amount_from_account_to_fund_basic() { Account( 2_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1110,15 +1038,11 @@ fn take_amount_from_account_to_fund_basic() { assert_eq!(output.amount(), 1_800_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_eq!(*output.as_account().account_id(), account_id_1); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } @@ -1126,7 +1050,7 @@ fn take_amount_from_account_to_fund_basic() { } #[test] -fn account_burn_should_not_validate_account_sender() { +fn account_burn_should_validate_account_sender() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); @@ -1135,8 +1059,6 @@ fn account_burn_should_not_validate_account_sender() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1156,22 +1078,33 @@ fn account_burn_should_not_validate_account_sender() { )]); let selected = InputSelection::new( - inputs, - outputs, + inputs.clone(), + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) .with_burn(Burn::new().add_account(account_id_1)) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ACCOUNT_1).unwrap() - )); + assert!(unsorted_eq(&selected.inputs, &inputs)); + // One output should be added for the remainder. + assert_eq!(selected.outputs.len(), 2); + assert!(selected.outputs.contains(&outputs[0])); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 1_000_000, + BECH32_ADDRESS_ED25519_0, + None, + )); + } + }); } #[test] -fn account_burn_should_not_validate_account_address() { +fn account_burn_should_validate_account_address() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); @@ -1180,8 +1113,6 @@ fn account_burn_should_not_validate_account_address() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1201,108 +1132,29 @@ fn account_burn_should_not_validate_account_address() { )]); let selected = InputSelection::new( - inputs, - outputs, + inputs.clone(), + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) .with_burn(Burn::new().add_account(account_id_1)) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 - )); -} - -#[test] -fn account_governance_transition_should_not_validate_account_sender() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([ - Basic(2_000_000, BECH32_ADDRESS_ED25519_0, None, None, None, None, None, None), - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - ), - ]); - let mut outputs = build_outputs([Basic( - 2_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ACCOUNT_1), - None, - None, - None, - None, - )]); - outputs.push(inputs[1].output.clone()); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ACCOUNT_1).unwrap() - )); -} - -#[test] -fn account_governance_transition_should_not_validate_account_address() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([ - Basic(2_000_000, BECH32_ADDRESS_ACCOUNT_1, None, None, None, None, None, None), - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - ), - ]); - let mut outputs = build_outputs([Basic( - 2_000_000, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - None, - None, - )]); - outputs.push(inputs[1].output.clone()); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 - )); + assert!(unsorted_eq(&selected.inputs, &inputs)); + // One output should be added for the remainder. + assert_eq!(selected.outputs.len(), 2); + assert!(selected.outputs.contains(&outputs[0])); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 1_000_000, + BECH32_ADDRESS_ED25519_0, + None, + )); + } + }); } #[test] @@ -1313,8 +1165,6 @@ fn transitioned_zero_account_id_no_longer_is_zero() { let inputs = build_inputs([Account( 2_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1350,15 +1200,11 @@ fn transitioned_zero_account_id_no_longer_is_zero() { assert_eq!(output.amount(), 1_000_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_ne!(*output.as_account().account_id(), account_id_0); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } @@ -1375,8 +1221,6 @@ fn two_accounts_required() { Account( 2_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1386,8 +1230,6 @@ fn two_accounts_required() { Account( 2_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -1448,9 +1290,7 @@ fn state_controller_sender_required() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1479,16 +1319,6 @@ fn state_controller_sender_required() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&outputs[0])); - assert!( - selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.state_index() == inputs[0].output.as_account().state_index() + 1 - } else { - false - }) - ) } #[test] @@ -1499,9 +1329,7 @@ fn state_controller_sender_required_already_selected() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1511,9 +1339,7 @@ fn state_controller_sender_required_already_selected() { Account( 1_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1546,84 +1372,61 @@ fn state_controller_sender_required_already_selected() { } #[test] -fn state_controller_sender_required_but_governance() { +fn state_transition_and_required() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, None, )]); - let outputs = build_outputs([ - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - ), - Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_0), - None, - None, - None, - None, - ), - ]); + let outputs = build_outputs([Account( + 2_000_000, + account_id_1, + BECH32_ADDRESS_ED25519_0, + None, + None, + None, + None, + )]); let selected = InputSelection::new( inputs.clone(), - outputs, + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) .with_required_inputs([*inputs[0].output_id()]) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - )); + assert!(unsorted_eq(&selected.inputs, &inputs)); + assert!(unsorted_eq(&selected.outputs, &outputs)); } #[test] -fn governor_sender_required() { +fn remainder_address_in_state_controller() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - let inputs = build_inputs([ - Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - ), - Basic(1_000_000, BECH32_ADDRESS_ED25519_0, None, None, None, None, None, None), - ]); - let outputs = build_outputs([Basic( - 1_000_000, + let inputs = build_inputs([Account( + 2_000_000, + account_id_1, BECH32_ADDRESS_ED25519_0, None, - Some(BECH32_ADDRESS_ED25519_1), + None, + None, + None, + )]); + let outputs = build_outputs([Account( + 1_000_000, + account_id_1, + BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1633,7 +1436,7 @@ fn governor_sender_required() { let selected = InputSelection::new( inputs.clone(), outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1]), + addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) .select() @@ -1642,763 +1445,14 @@ fn governor_sender_required() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&outputs[0])); - assert!( - selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.state_index() == inputs[0].output.as_account().state_index() - } else { - false - }) - ) -} - -#[test] -fn governor_sender_required_already_selected() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([ - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - ), - Basic(1_000_000, BECH32_ADDRESS_ED25519_1, None, None, None, None, None, None), - ]); - let outputs = build_outputs([ - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - ), - Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_1), - None, - None, - None, - None, - ), - ]); - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .with_required_inputs([*inputs[0].output_id()]) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); -} - -#[test] -fn governance_transition_and_required() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .with_required_inputs([*inputs[0].output_id()]) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); -} - -#[test] -fn state_transition_and_required() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 2_000_000, - account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .with_required_inputs([*inputs[0].output_id()]) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); -} - -#[test] -fn governor_sender_required_but_state() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([ - Account( - 1_000_000, - account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - ), - Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_1), - None, - None, - None, - None, - ), - ]); - - let selected = InputSelection::new( - inputs.clone(), - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .with_required_inputs([*inputs[0].output_id()]) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ED25519_1).unwrap() - )); -} - -#[test] -fn both_state_controller_and_governor_sender() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([ - Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_0), - None, - None, - None, - None, - ), - Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_1), - None, - None, - None, - None, - ), - ]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - )); -} - -#[test] -fn remainder_address_in_state_controller() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ACCOUNT_2, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 1_000_000, - account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ACCOUNT_2, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert_eq!(selected.outputs.len(), 2); - assert!(selected.outputs.contains(&outputs[0])); - selected.outputs.iter().for_each(|output| { - if !outputs.contains(output) { - assert!(is_remainder_or_return( - output, - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None - )); - } - }); -} - -#[test] -fn remainder_address_in_governor() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([ - Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ACCOUNT_2, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - ), - Basic(1_000_000, BECH32_ADDRESS_ED25519_0, None, None, None, None, None, None), - ]); - let outputs = build_outputs([Account( - 1_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ACCOUNT_2, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - // Add the basic output so it will be consumed - .with_required_inputs([*inputs[1].output_id()]) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert_eq!(selected.outputs.len(), 2); - assert!(selected.outputs.contains(&outputs[0])); - selected.outputs.iter().for_each(|output| { - if !outputs.contains(output) { - assert!(is_remainder_or_return( - output, - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None - )); - } - }); -} - -#[test] -fn do_not_change_amount_of_governance_transition() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_1), - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::InsufficientAmount { - found: 2_000_000, - required: 3_000_000, - }) - )); -} - -#[test] -fn state_transition_required_but_state_controller_not_provided() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::InsufficientAmount { - found: 0, - required: 1_000_000, - }) - )); -} - -#[test] -fn state_transition_but_state_controller_not_owned() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 2_000_000, - account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_1]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address))) if address == Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - )); -} - -#[test] -fn governance_transition_but_governor_not_owned() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address))) if address == Address::try_from_bech32(BECH32_ADDRESS_ED25519_1).unwrap() - )); -} - -#[test] -fn burn_account_but_governor_not_owned() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_2]), - protocol_parameters, - ) - .with_burn(Burn::new().add_account(account_id_1)) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address))) if address == Address::try_from_bech32(BECH32_ADDRESS_ED25519_1).unwrap() - )); -} - -#[test] -fn sender_in_state_controller_but_not_owned() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_0), - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_2]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - )); -} - -#[test] -fn sender_in_governor_but_not_owned() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let inputs = build_inputs([Account( - 2_000_000, - account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - Some(BECH32_ADDRESS_ED25519_1), - None, - None, - None, - None, - )]); - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_2]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Sender(sender))) if sender == Address::try_from_bech32(BECH32_ADDRESS_ED25519_1).unwrap() - )); -} - -#[test] -fn new_state_metadata() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let account_output = - AccountOutputBuilder::new_with_minimum_storage_deposit(protocol_parameters.rent_structure(), account_id_1) - .with_state_metadata([1, 2, 3]) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .finish_output(protocol_parameters.token_supply()) - .unwrap(); - - let inputs = [InputSigningData { - output: account_output.clone(), - output_metadata: rand_output_metadata(), - chain: None, - }]; - - // New account output, with updated state index - let updated_account_output = AccountOutputBuilder::from(account_output.as_account()) - .with_minimum_storage_deposit(protocol_parameters.rent_structure()) - .with_state_metadata([3, 4, 5]) - .with_state_index(account_output.as_account().state_index() + 1) - .finish_output(protocol_parameters.token_supply()) - .unwrap(); - - let outputs = [updated_account_output]; - - let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select() - .unwrap(); - - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); -} - -#[test] -fn new_state_metadata_but_same_state_index() { - let protocol_parameters = protocol_parameters(); - let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - - let account_output = - AccountOutputBuilder::new_with_minimum_storage_deposit(protocol_parameters.rent_structure(), account_id_1) - .with_state_metadata([1, 2, 3]) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .finish_output(protocol_parameters.token_supply()) - .unwrap(); - - let inputs = [InputSigningData { - output: account_output.clone(), - output_metadata: rand_output_metadata(), - chain: None, - }]; - - // New account output, without updated state index - let updated_account_output = AccountOutputBuilder::from(account_output.as_account()) - .with_minimum_storage_deposit(protocol_parameters.rent_structure()) - .with_state_metadata([3, 4, 5]) - .finish_output(protocol_parameters.token_supply()) - .unwrap(); - - let outputs = [updated_account_output]; - - let selected = InputSelection::new( - inputs, - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account( - account_id, - _account_transition, - ))) if account_id == account_id_1 - )); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 1_000_000, + BECH32_ADDRESS_ED25519_0, + None + )); + } + }); } diff --git a/sdk/tests/client/input_selection/basic_outputs.rs b/sdk/tests/client/input_selection/basic_outputs.rs index ed2792cc39..201d6c0686 100644 --- a/sdk/tests/client/input_selection/basic_outputs.rs +++ b/sdk/tests/client/input_selection/basic_outputs.rs @@ -554,8 +554,6 @@ fn account_sender() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -609,8 +607,6 @@ fn account_sender_zero_id() { Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, diff --git a/sdk/tests/client/input_selection/burn.rs b/sdk/tests/client/input_selection/burn.rs index 346fcd16ab..c89c1e26e1 100644 --- a/sdk/tests/client/input_selection/burn.rs +++ b/sdk/tests/client/input_selection/burn.rs @@ -10,7 +10,7 @@ use iota_sdk::{ client::api::input_selection::{Burn, Error, InputSelection, Requirement}, types::block::{ address::Address, - output::{AccountId, AccountTransition, ChainId, NftId, SimpleTokenScheme, TokenId}, + output::{AccountId, ChainId, NftId, SimpleTokenScheme, TokenId}, protocol::protocol_parameters, }, }; @@ -32,8 +32,6 @@ fn burn_account_present() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -77,8 +75,6 @@ fn burn_account_present_and_required() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -197,7 +193,7 @@ fn burn_account_absent() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::Governance))) if account_id == account_id_1 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 )); } @@ -211,8 +207,6 @@ fn burn_accounts_present() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -222,8 +216,6 @@ fn burn_accounts_present() { Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -266,8 +258,6 @@ fn burn_account_in_outputs() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -280,8 +270,6 @@ fn burn_account_in_outputs() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -406,8 +394,6 @@ fn burn_nft_id_zero() { Account( 1_000_000, account_id_0, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -605,8 +591,6 @@ fn burn_foundry_present() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -654,15 +638,11 @@ fn burn_foundry_present() { assert_eq!(output.amount(), 1_000_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_eq!(*output.as_account().account_id(), account_id_1); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } else { @@ -691,8 +671,6 @@ fn burn_foundry_absent() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -750,8 +728,6 @@ fn burn_foundries_present() { Account( 1_000_000, account_id_1, - 2, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -792,15 +768,11 @@ fn burn_foundries_present() { assert_eq!(output.amount(), 1_000_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_eq!(*output.as_account().account_id(), account_id_1); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } @@ -903,8 +875,6 @@ fn burn_foundry_and_its_account() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -926,7 +896,7 @@ fn burn_foundry_and_its_account() { let selected = InputSelection::new( inputs.clone(), - outputs, + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) @@ -935,10 +905,23 @@ fn burn_foundry_and_its_account() { .add_foundry(inputs[0].output.as_foundry().id()) .add_account(account_id_1), ) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 - )); + assert_eq!(selected.inputs.len(), 2); + assert!(selected.inputs.contains(&inputs[0])); + assert!(selected.inputs.contains(&inputs[1])); + // One output should be added for the remainder. + assert_eq!(selected.outputs.len(), 2); + assert!(selected.outputs.contains(&outputs[0])); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 1_500_000, + BECH32_ADDRESS_ED25519_0, + None, + )); + } + }); } diff --git a/sdk/tests/client/input_selection/expiration.rs b/sdk/tests/client/input_selection/expiration.rs index 6fbf1e08f9..7128f505b3 100644 --- a/sdk/tests/client/input_selection/expiration.rs +++ b/sdk/tests/client/input_selection/expiration.rs @@ -683,8 +683,6 @@ fn expiration_expired_only_account_addresses() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index d5b46afb77..2958c9dc76 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -11,8 +11,8 @@ use iota_sdk::{ types::block::{ address::{AccountAddress, Address}, output::{ - unlock_condition::{GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition}, - AccountId, AccountOutputBuilder, AccountTransition, FoundryId, Output, SimpleTokenScheme, TokenId, + unlock_condition::AddressUnlockCondition, AccountId, AccountOutputBuilder, FoundryId, Output, + SimpleTokenScheme, TokenId, }, protocol::protocol_parameters, rand::output::rand_output_metadata, @@ -59,7 +59,7 @@ fn missing_input_account_for_foundry() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_2 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_2 )); } @@ -99,13 +99,6 @@ fn missing_input_account_for_foundry() { // assert!(unsorted_eq(&selected.inputs, &inputs)); // // Account next state + foundry // assert_eq!(selected.outputs.len(), 2); -// // Account state index is increased -// selected.outputs.iter().for_each(|output| { -// if let Output::Account(account_output) = &output { -// // Input account has index 0, output should have index 1 -// assert_eq!(account_output.state_index(), 1); -// } -// }); // } #[test] @@ -118,8 +111,6 @@ fn minted_native_tokens_in_new_remainder() { Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -147,12 +138,7 @@ fn minted_native_tokens_in_new_remainder() { assert!(unsorted_eq(&selected.inputs, &inputs)); // Account next state + foundry + basic output with native tokens assert_eq!(selected.outputs.len(), 3); - // Account state index is increased selected.outputs.iter().for_each(|output| { - if let Output::Account(account_output) = &output { - // Input account has index 0, output should have index 1 - assert_eq!(account_output.state_index(), 1); - } if let Output::Basic(basic_output) = &output { // Basic output remainder has the minted native tokens assert_eq!(basic_output.native_tokens().first().unwrap().amount().as_u32(), 10); @@ -172,8 +158,6 @@ fn minted_native_tokens_in_provided_output() { Account( 1_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -236,10 +220,7 @@ fn melt_native_tokens() { ), ]); let account_output = AccountOutputBuilder::new_with_amount(1_000_000, account_id_1) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) @@ -271,12 +252,7 @@ fn melt_native_tokens() { assert!(unsorted_eq(&selected.inputs, &inputs)); // Account next state + foundry + basic output with native tokens assert_eq!(selected.outputs.len(), 3); - // Account state index is increased selected.outputs.iter().for_each(|output| { - if let Output::Account(account_output) = &output { - // Input account has index 0, output should have index 1 - assert_eq!(account_output.state_index(), 1); - } if let Output::Basic(basic_output) = &output { // Basic output remainder has the remaining native tokens assert_eq!(basic_output.native_tokens().first().unwrap().amount().as_u32(), 5); @@ -290,17 +266,7 @@ fn destroy_foundry_with_account_state_transition() { let account_id_2 = AccountId::from_str(ACCOUNT_ID_2).unwrap(); let inputs = build_inputs([ - Account( - 50_300, - account_id_2, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - ), + Account(50_300, account_id_2, BECH32_ADDRESS_ED25519_0, None, None, None, None), Foundry( 52_800, account_id_2, @@ -311,7 +277,6 @@ fn destroy_foundry_with_account_state_transition() { ]); let account_output = AccountOutputBuilder::from(inputs[0].output.as_account()) .with_amount(103_100) - .with_state_index(inputs[0].output.as_account().state_index() + 1) .finish_output(TOKEN_SUPPLY) .unwrap(); // Account output gets the amount from the foundry output added @@ -332,48 +297,6 @@ fn destroy_foundry_with_account_state_transition() { assert_eq!(selected.outputs.len(), 1); } -#[test] -fn destroy_foundry_with_account_governance_transition() { - let protocol_parameters = protocol_parameters(); - let account_id_2 = AccountId::from_str(ACCOUNT_ID_2).unwrap(); - - let inputs = build_inputs([ - Account( - 1_000_000, - account_id_2, - 1, - BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - ), - Foundry( - 1_000_000, - account_id_2, - 1, - SimpleTokenScheme::new(10, 10, 10).unwrap(), - None, - ), - ]); - let outputs = [inputs[0].output.clone()]; - - let selected = InputSelection::new( - inputs.clone(), - outputs, - addresses([BECH32_ADDRESS_ED25519_0]), - protocol_parameters, - ) - .with_burn(Burn::new().add_foundry(inputs[1].output.as_foundry().id())) - .select(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_2 - )); -} - #[test] fn destroy_foundry_with_account_burn() { let protocol_parameters = protocol_parameters(); @@ -383,8 +306,6 @@ fn destroy_foundry_with_account_burn() { Account( 1_000_000, account_id_2, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -412,7 +333,7 @@ fn destroy_foundry_with_account_burn() { let selected = InputSelection::new( inputs.clone(), - outputs, + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) @@ -421,12 +342,22 @@ fn destroy_foundry_with_account_burn() { .add_foundry(inputs[1].output.as_foundry().id()) .add_account(account_id_2), ) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_2 - )); + assert!(unsorted_eq(&selected.inputs, &inputs)); + assert_eq!(selected.outputs.len(), 2); + assert!(selected.outputs.contains(&outputs[0])); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 1_000_000, + BECH32_ADDRESS_ED25519_0, + None, + )); + } + }); } #[test] @@ -438,8 +369,6 @@ fn prefer_basic_to_foundry() { Account( 1_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -496,13 +425,9 @@ fn simple_foundry_transition_basic_not_needed() { ), ]); let account_output = AccountOutputBuilder::new_with_amount(2_000_000, account_id_1) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) - .with_state_index(1) .with_foundry_counter(1) .finish_output(protocol_parameters.token_supply()) .unwrap(); @@ -540,15 +465,11 @@ fn simple_foundry_transition_basic_not_needed() { assert_eq!(output.amount(), 2_000_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_eq!(*output.as_account().account_id(), account_id_1); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } @@ -571,14 +492,10 @@ fn simple_foundry_transition_basic_not_needed_with_remainder() { ), ]); let account_output = AccountOutputBuilder::new_with_amount(2_000_000, account_id_1) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) - .with_state_index(1) .finish_output(protocol_parameters.token_supply()) .unwrap(); inputs.push(InputSigningData { @@ -614,15 +531,11 @@ fn simple_foundry_transition_basic_not_needed_with_remainder() { assert_eq!(output.amount(), 2_000_000); assert_eq!(output.as_account().native_tokens().len(), 0); assert_eq!(*output.as_account().account_id(), account_id_1); - assert_eq!(output.as_account().unlock_conditions().len(), 2); + assert_eq!(output.as_account().unlock_conditions().len(), 1); assert_eq!(output.as_account().features().len(), 0); assert_eq!(output.as_account().immutable_features().len(), 0); assert_eq!( - *output.as_account().state_controller_address(), - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() - ); - assert_eq!( - *output.as_account().governor_address(), + *output.as_account().address(), Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() ); } else if output.is_basic() { @@ -679,7 +592,7 @@ fn simple_foundry_transition_basic_not_needed_with_remainder() { // // assert_eq!(output.amount(), 2_000_000); // // assert_eq!(output.as_account().native_tokens().len(), 0); // // assert_eq!(*output.as_account().account_id(), account_id_1); -// // assert_eq!(output.as_account().unlock_conditions().len(), 2); +// // assert_eq!(output.as_account().unlock_conditions().len(), 1); // // assert_eq!(output.as_account().features().len(), 0); // // assert_eq!(output.as_account().immutable_features().len(), 0); // // assert_eq!( @@ -721,14 +634,10 @@ fn mint_and_burn_at_the_same_time() { Some(vec![(&token_id.to_string(), 100)]), )]); let account_output = AccountOutputBuilder::new_with_amount(2_000_000, account_id_1) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) - .with_state_index(1) .finish_output(protocol_parameters.token_supply()) .unwrap(); inputs.push(InputSigningData { @@ -778,14 +687,10 @@ fn take_amount_from_account_and_foundry_to_fund_basic() { ), ]); let account_output = AccountOutputBuilder::new_with_amount(2_000_000, account_id_1) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) - .with_state_index(1) .finish_output(protocol_parameters.token_supply()) .unwrap(); inputs.push(InputSigningData { @@ -828,15 +733,13 @@ fn take_amount_from_account_and_foundry_to_fund_basic() { fn create_native_token_but_burn_account() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); - let foundry_id = FoundryId::build(&AccountAddress::from(account_id_1), 0, SimpleTokenScheme::KIND); + let foundry_id = FoundryId::build(&AccountAddress::from(account_id_1), 1, SimpleTokenScheme::KIND); let token_id = TokenId::from(foundry_id); let inputs = build_inputs([ Account( 2_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -860,18 +763,29 @@ fn create_native_token_but_burn_account() { )]); let selected = InputSelection::new( - inputs, - outputs, + inputs.clone(), + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) .with_burn(Burn::new().add_account(account_id_1)) - .select(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 - )); + assert!(unsorted_eq(&selected.inputs, &inputs)); + // One output should be added for the remainder. + assert_eq!(selected.outputs.len(), 2); + assert!(selected.outputs.contains(&outputs[0])); + selected.outputs.iter().for_each(|output| { + if !outputs.contains(output) { + assert!(is_remainder_or_return( + output, + 2_000_000, + BECH32_ADDRESS_ED25519_0, + None, + )); + } + }); } #[test] @@ -885,8 +799,6 @@ fn melted_tokens_not_provided() { Account( 2_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -937,8 +849,6 @@ fn burned_tokens_not_provided() { Account( 2_000_000, account_id_1, - 1, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -992,14 +902,10 @@ fn foundry_in_outputs_and_required() { None, )]); let account_output = AccountOutputBuilder::new_with_amount(1_251_500, account_id_2) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) - .with_state_index(1) .finish_output(protocol_parameters.token_supply()) .unwrap(); inputs.push(InputSigningData { @@ -1053,10 +959,7 @@ fn melt_and_burn_native_tokens() { ), ]); let account_output = AccountOutputBuilder::new_with_amount(1_000_000, account_id) - .add_unlock_condition(StateControllerAddressUnlockCondition::new( - Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), - )) - .add_unlock_condition(GovernorAddressUnlockCondition::new( + .add_unlock_condition(AddressUnlockCondition::new( Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap(), )) .with_foundry_counter(1) @@ -1092,10 +995,6 @@ fn melt_and_burn_native_tokens() { assert_eq!(selected.outputs.len(), 3); // Account state index is increased selected.outputs.iter().for_each(|output| { - if let Output::Account(account_output) = &output { - // Input account has index 0, output should have index 1 - assert_eq!(account_output.state_index(), 1); - } if let Output::Basic(basic_output) = &output { // Basic output remainder has the remaining native tokens assert_eq!(basic_output.native_tokens().first().unwrap().amount().as_u32(), 421); diff --git a/sdk/tests/client/input_selection/outputs.rs b/sdk/tests/client/input_selection/outputs.rs index 79377b46a7..02697eadb1 100644 --- a/sdk/tests/client/input_selection/outputs.rs +++ b/sdk/tests/client/input_selection/outputs.rs @@ -77,8 +77,6 @@ fn no_outputs_but_burn() { let inputs = build_inputs([Account( 2_000_000, account_id_2, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, diff --git a/sdk/tests/client/input_selection/storage_deposit_return.rs b/sdk/tests/client/input_selection/storage_deposit_return.rs index 673cf54ca6..d74121fef7 100644 --- a/sdk/tests/client/input_selection/storage_deposit_return.rs +++ b/sdk/tests/client/input_selection/storage_deposit_return.rs @@ -507,8 +507,6 @@ fn sdruc_required_non_ed25519_in_address_unlock() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, @@ -571,8 +569,6 @@ fn useless_sdruc_non_ed25519_in_address_unlock() { Account( 1_000_000, account_id_1, - 0, - BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, None, diff --git a/sdk/tests/client/mod.rs b/sdk/tests/client/mod.rs index e1ea886413..44d55347f5 100644 --- a/sdk/tests/client/mod.rs +++ b/sdk/tests/client/mod.rs @@ -29,8 +29,7 @@ use iota_sdk::{ output::{ feature::{IssuerFeature, SenderFeature}, unlock_condition::{ - AddressUnlockCondition, ExpirationUnlockCondition, GovernorAddressUnlockCondition, - ImmutableAccountAddressUnlockCondition, StateControllerAddressUnlockCondition, + AddressUnlockCondition, ExpirationUnlockCondition, ImmutableAccountAddressUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, UnlockCondition, }, AccountId, AccountOutputBuilder, BasicOutputBuilder, FoundryOutputBuilder, NativeToken, NativeTokens, @@ -86,8 +85,6 @@ enum Build<'a> { Account( u64, AccountId, - u32, - &'a str, &'a str, Option>, Option<&'a str>, @@ -183,17 +180,13 @@ fn build_nft_output( fn build_account_output( amount: u64, account_id: AccountId, - state_index: u32, - state_address: Bech32Address, - governor_address: Bech32Address, + address: Bech32Address, native_tokens: Option>, bech32_sender: Option, bech32_issuer: Option, ) -> Output { let mut builder = AccountOutputBuilder::new_with_amount(amount, account_id) - .with_state_index(state_index) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(state_address)) - .add_unlock_condition(GovernorAddressUnlockCondition::new(governor_address)); + .add_unlock_condition(AddressUnlockCondition::new(address)); if let Some(native_tokens) = native_tokens { builder = builder.with_native_tokens( @@ -274,23 +267,11 @@ fn build_output_inner(build: Build) -> (Output, Option) { ), chain, ), - Build::Account( - amount, - account_id, - state_index, - state_address, - governor_address, - native_tokens, - bech32_sender, - bech32_issuer, - chain, - ) => ( + Build::Account(amount, account_id, address, native_tokens, bech32_sender, bech32_issuer, chain) => ( build_account_output( amount, account_id, - state_index, - Bech32Address::try_from_str(state_address).unwrap(), - Bech32Address::try_from_str(governor_address).unwrap(), + Bech32Address::try_from_str(address).unwrap(), native_tokens, bech32_sender.map(|address| Bech32Address::try_from_str(address).unwrap()), bech32_issuer.map(|address| Bech32Address::try_from_str(address).unwrap()), diff --git a/sdk/tests/client/node_api/indexer.rs b/sdk/tests/client/node_api/indexer.rs index ef726b8ee9..1ab8a7ae4d 100644 --- a/sdk/tests/client/node_api/indexer.rs +++ b/sdk/tests/client/node_api/indexer.rs @@ -111,7 +111,6 @@ // let alias_output_1 = AccountOutputBuilder::from(alias_output_0.as_alias()) // .with_alias_id(alias_id) -// .with_state_index(alias_output_0.as_alias().state_index() + 1) // .with_foundry_counter(alias_output_0.as_alias().foundry_counter() + 1) // .finish_output(protocol_parameters.token_supply())?; diff --git a/sdk/tests/client/signing/account.rs b/sdk/tests/client/signing/account.rs index 711bd280ca..e510d3c0c0 100644 --- a/sdk/tests/client/signing/account.rs +++ b/sdk/tests/client/signing/account.rs @@ -36,7 +36,7 @@ use crate::client::{ async fn sign_account_state_transition() -> Result<()> { let secret_manager = SecretManager::try_from_mnemonic(Client::generate_mnemonic()?)?; - let bech32_address_0 = &secret_manager + let bech32_address = &secret_manager .generate_ed25519_addresses( GetAddressesOptions::default() .with_coin_type(SHIMMER_COIN_TYPE) @@ -45,15 +45,6 @@ async fn sign_account_state_transition() -> Result<()> { .await?[0] .clone() .to_bech32(SHIMMER_TESTNET_BECH32_HRP); - let bech32_address_1 = &secret_manager - .generate_ed25519_addresses( - GetAddressesOptions::default() - .with_coin_type(SHIMMER_COIN_TYPE) - .with_range(1..2), - ) - .await?[0] - .clone() - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); let protocol_parameters = protocol_parameters(); let account_id = AccountId::from_str(ACCOUNT_ID_1)?; @@ -61,9 +52,7 @@ async fn sign_account_state_transition() -> Result<()> { let inputs = build_inputs([Account( 1_000_000, account_id, - 0, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), + &bech32_address.to_string(), None, None, None, @@ -73,94 +62,7 @@ async fn sign_account_state_transition() -> Result<()> { let outputs = build_outputs([Account( 1_000_000, account_id, - 1, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), - None, - None, - None, - None, - )]); - - let transaction = Transaction::builder(protocol_parameters.network_id()) - .with_inputs( - inputs - .iter() - .map(|i| Input::Utxo(UtxoInput::from(*i.output_metadata.output_id()))) - .collect::>(), - ) - .with_outputs(outputs) - .add_mana_allotment(rand_mana_allotment(&protocol_parameters)) - .finish_with_params(protocol_parameters)?; - - let prepared_transaction_data = PreparedTransactionData { - transaction, - inputs_data: inputs, - remainder: None, - }; - - let unlocks = secret_manager.transaction_unlocks(&prepared_transaction_data).await?; - - assert_eq!(unlocks.len(), 1); - assert_eq!((*unlocks).get(0).unwrap().kind(), SignatureUnlock::KIND); - - let tx_payload = SignedTransactionPayload::new(prepared_transaction_data.transaction.clone(), unlocks)?; - - validate_signed_transaction_payload_length(&tx_payload)?; - - let conflict = verify_semantic(&prepared_transaction_data.inputs_data, &tx_payload)?; - - if let Some(conflict) = conflict { - panic!("{conflict:?}, with {tx_payload:#?}"); - } - - Ok(()) -} - -#[tokio::test] -async fn sign_account_governance_transition() -> Result<()> { - let secret_manager = SecretManager::try_from_mnemonic(Client::generate_mnemonic()?)?; - - let bech32_address_0 = &secret_manager - .generate_ed25519_addresses( - GetAddressesOptions::default() - .with_coin_type(SHIMMER_COIN_TYPE) - .with_range(0..1), - ) - .await?[0] - .clone() - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); - let bech32_address_1 = &secret_manager - .generate_ed25519_addresses( - GetAddressesOptions::default() - .with_coin_type(SHIMMER_COIN_TYPE) - .with_range(1..2), - ) - .await?[0] - .clone() - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); - - let protocol_parameters = protocol_parameters(); - let account_id = AccountId::from_str(ACCOUNT_ID_1)?; - - let inputs = build_inputs([Account( - 1_000_000, - account_id, - 0, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), - None, - None, - None, - Some(Bip44::new(SHIMMER_COIN_TYPE).with_address_index(1)), - )]); - - let outputs = build_outputs([Account( - 1_000_000, - account_id, - 0, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), + &bech32_address.to_string(), None, None, None, @@ -206,7 +108,7 @@ async fn sign_account_governance_transition() -> Result<()> { async fn account_reference_unlocks() -> Result<()> { let secret_manager = SecretManager::try_from_mnemonic(Client::generate_mnemonic()?)?; - let bech32_address_0 = &secret_manager + let bech32_address = &secret_manager .generate_ed25519_addresses( GetAddressesOptions::default() .with_coin_type(SHIMMER_COIN_TYPE) @@ -215,15 +117,6 @@ async fn account_reference_unlocks() -> Result<()> { .await?[0] .clone() .to_bech32(SHIMMER_TESTNET_BECH32_HRP); - let bech32_address_1 = &secret_manager - .generate_ed25519_addresses( - GetAddressesOptions::default() - .with_coin_type(SHIMMER_COIN_TYPE) - .with_range(1..2), - ) - .await?[0] - .clone() - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); let protocol_parameters = protocol_parameters(); let account_id = AccountId::from_str(ACCOUNT_ID_1)?; @@ -234,9 +127,7 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - 0, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), + &bech32_address.to_string(), None, None, None, @@ -268,9 +159,7 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - 1, - &bech32_address_0.to_string(), - &bech32_address_1.to_string(), + &bech32_address.to_string(), None, None, None, diff --git a/sdk/tests/client/signing/mod.rs b/sdk/tests/client/signing/mod.rs index 8ee36fc9a9..c2e1171c67 100644 --- a/sdk/tests/client/signing/mod.rs +++ b/sdk/tests/client/signing/mod.rs @@ -83,8 +83,6 @@ async fn all_combined() -> Result<()> { Account( 1_000_000, account_id_1, - 0, - &nft_1_bech32_address.to_string(), &nft_1_bech32_address.to_string(), None, None, @@ -94,9 +92,7 @@ async fn all_combined() -> Result<()> { Account( 1_000_000, account_id_2, - 0, &ed25519_bech32_address_0.to_string(), - &ed25519_bech32_address_1.to_string(), None, None, None, @@ -283,8 +279,6 @@ async fn all_combined() -> Result<()> { Account( 1_000_000, account_id_1, - 1, - &nft_1_bech32_address.to_string(), &nft_1_bech32_address.to_string(), None, None, @@ -294,9 +288,7 @@ async fn all_combined() -> Result<()> { Account( 1_000_000, account_id_2, - 1, &ed25519_bech32_address_0.to_string(), - &ed25519_bech32_address_1.to_string(), None, None, None, diff --git a/sdk/tests/types/address/restricted.rs b/sdk/tests/types/address/restricted.rs index d68a871bec..dc50f4c880 100644 --- a/sdk/tests/types/address/restricted.rs +++ b/sdk/tests/types/address/restricted.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use iota_sdk::types::block::{ - address::{Address, AddressCapabilities, AddressCapabilityFlag, Ed25519Address, RestrictedAddress, ToBech32Ext}, + address::{Address, AddressCapabilities, AddressCapabilityFlag, RestrictedAddress, ToBech32Ext}, capabilities::CapabilityFlag, rand::address::rand_ed25519_address, }; @@ -40,132 +40,180 @@ fn capabilities() { #[test] fn restricted_ed25519() { - // Test from https://github.com/iotaledger/tips-draft/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings - let address = Ed25519Address::from_public_key_bytes( - hex::decode("6f1581709bb7b1ef030d210db18e3b0ba1c776fba65d8cdaad05415142d189f8") - .unwrap() - .try_into() - .unwrap(), + // Test from https://github.com/iotaledger/tips/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings + + // Ed25519 Address (Plain) + let address = Address::unpack_verified( + prefix_hex::decode::>("0x00efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a3").unwrap(), + &(), ) .unwrap(); assert_eq!( - hex::encode(address), - "efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a3" - ); - // Ed25519 Address (Plain) - assert_eq!( - address.to_bech32_unchecked("iota"), + address.clone().to_bech32_unchecked("iota"), "iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx" ); // Restricted Ed25519 Address (Every Capability Disallowed) let mut address = RestrictedAddress::new(address).unwrap(); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3000efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a300" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcq3l9hek" + "iota1xqqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcq8mnjgf" ); // Restricted Ed25519 Address (Every Capability Allowed) address.set_allowed_capabilities(AddressCapabilities::all()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3000efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a302ff01" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcplupydhwt" + "iota1xqqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gczluqs97eene" ); + // Restricted Ed25519 Address (Every Capability Disallowed Reset) address.set_allowed_capabilities(AddressCapabilities::none()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3000efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a300" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcq3l9hek" + "iota1xqqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcq8mnjgf" ); // Restricted Ed25519 Address (Can receive Native Tokens) address.set_allowed_capabilities([AddressCapabilityFlag::OutputsWithNativeTokens]); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3000efdc112efe262b304bcf379b26c31bad029f616ee3ec4aa6345a366e4c9e43a30101" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcpqytmqxr4" + "iota1xqqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcpqyla70tq" ); } #[test] fn restricted_account() { - // Test from https://github.com/iotaledger/tips-draft/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings + // Test from https://github.com/iotaledger/tips/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings + + // Account Address (Plain) let address = Address::unpack_verified( - hex::decode("08f1c011fb54df4a4e5b07462536fbacc779bf80cc45e03bc3410836587b4efc98").unwrap(), + prefix_hex::decode::>("0x0860441c013b400f402c317833366f48730610296a09243636343e7b1b7e115409").unwrap(), &(), ) .unwrap(); - // Account Address (Plain) assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota1prcuqy0m2n055njmqarz2dhm4nrhn0uqe3z7qw7rgyyrvkrmfm7fsnwyxu6" + "iota1ppsyg8qp8dqq7spvx9urxdn0fpesvypfdgyjgd3kxsl8kxm7z92qj2lln86" ); // Restricted Account Address (Every Capability Disallowed) let mut address = RestrictedAddress::new(address).unwrap(); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x300860441c013b400f402c317833366f48730610296a09243636343e7b1b7e11540900" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqqdyjudm" + "iota1xqyxq3quqya5qr6q9schsvekday8xpss994qjfpkxc6ru7cm0cg4gzgq9nu0d0" ); // Restricted Account Address (Every Capability Allowed) address.set_allowed_capabilities(AddressCapabilities::all()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x300860441c013b400f402c317833366f48730610296a09243636343e7b1b7e11540902ff01" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqplurds6sq" + "iota1xqyxq3quqya5qr6q9schsvekday8xpss994qjfpkxc6ru7cm0cg4gzgzluqs9xmye3" ); + // Restricted Account Address (Every Capability Disallowed Reset) address.set_allowed_capabilities(AddressCapabilities::none()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x300860441c013b400f402c317833366f48730610296a09243636343e7b1b7e11540900" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqqdyjudm" + "iota1xqyxq3quqya5qr6q9schsvekday8xpss994qjfpkxc6ru7cm0cg4gzgq9nu0d0" ); // Restricted Account Address (Can receive Native Tokens) address.set_allowed_capabilities([AddressCapabilityFlag::OutputsWithNativeTokens]); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x300860441c013b400f402c317833366f48730610296a09243636343e7b1b7e1154090101" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqpqyfjata7" + "iota1xqyxq3quqya5qr6q9schsvekday8xpss994qjfpkxc6ru7cm0cg4gzgpqys8pcr3" ); } #[test] fn restricted_nft() { - // Test from https://github.com/iotaledger/tips-draft/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings + // Test from https://github.com/iotaledger/tips/blob/tip50/tips/TIP-0050/tip-0050.md#bech32-strings + + // NFT Address (Plain) let address = Address::unpack_verified( - hex::decode("10c72a65ae53d70b99a57f72637bfd1d5ea7baa2b4ba095c989b667d38558087db").unwrap(), + prefix_hex::decode::>("0x10140f39267a343f0d650a751250445e40600d133522085d210a2b5f3f69445139").unwrap(), &(), ) .unwrap(); - // NFT Address (Plain) assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota1zrrj5edw20tshxd90aexx7lar4020w4zkjaqjhycndn86wz4szrak44cs6h" + "iota1zq2q7wfx0g6r7rt9pf63y5zyteqxqrgnx53qshfppg4470mfg3gnjfmvts0" ); // Restricted NFT Address (Every Capability Disallowed) let mut address = RestrictedAddress::new(address).unwrap(); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3010140f39267a343f0d650a751250445e40600d133522085d210a2b5f3f6944513900" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcqek0lex" + "iota1xqgpgreeyearg0cdv5982yjsg30yqcqdzv6jyzzayy9zkheld9z9zwgqjt4fkk" ); // Restricted NFT Address (Every Capability Allowed) address.set_allowed_capabilities(AddressCapabilities::all()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3010140f39267a343f0d650a751250445e40600d133522085d210a2b5f3f6944513902ff01" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcpluts738a" + "iota1xqgpgreeyearg0cdv5982yjsg30yqcqdzv6jyzzayy9zkheld9z9zwgzluqs3ctnc5" ); + // Restricted NFT Address (Every Capability Disallowed Reset) address.set_allowed_capabilities(AddressCapabilities::none()); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3010140f39267a343f0d650a751250445e40600d133522085d210a2b5f3f6944513900" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcqek0lex" + "iota1xqgpgreeyearg0cdv5982yjsg30yqcqdzv6jyzzayy9zkheld9z9zwgqjt4fkk" ); // Restricted NFT Address (Can receive Native Tokens) address.set_allowed_capabilities([AddressCapabilityFlag::OutputsWithNativeTokens]); + assert_eq!( + prefix_hex::encode(Address::from(address.clone()).pack_to_vec()), + "0x3010140f39267a343f0d650a751250445e40600d133522085d210a2b5f3f694451390101" + ); assert_eq!( address.clone().to_bech32_unchecked("iota"), - "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcpqyp0nq2r" + "iota1xqgpgreeyearg0cdv5982yjsg30yqcqdzv6jyzzayy9zkheld9z9zwgpqysq5lyk" ); } diff --git a/sdk/tests/types/output/account.rs b/sdk/tests/types/output/account.rs index c4c423cf4c..a8cc3b34a2 100644 --- a/sdk/tests/types/output/account.rs +++ b/sdk/tests/types/output/account.rs @@ -9,10 +9,7 @@ use iota_sdk::types::{ rand::output::{ feature::{rand_issuer_feature, rand_metadata_feature, rand_sender_feature}, rand_account_id, rand_account_output, - unlock_condition::{ - rand_governor_address_unlock_condition_different_from, - rand_state_controller_address_unlock_condition_different_from, - }, + unlock_condition::rand_address_unlock_condition_different_from_account_id, }, }, ValidationParams, @@ -25,10 +22,8 @@ fn builder() { let protocol_parameters = protocol_parameters(); let account_id = rand_account_id(); let foundry_id = FoundryId::build(&AccountAddress::from(account_id), 0, SimpleTokenScheme::KIND); - let gov_address_1 = rand_governor_address_unlock_condition_different_from(&account_id); - let gov_address_2 = rand_governor_address_unlock_condition_different_from(&account_id); - let state_address_1 = rand_state_controller_address_unlock_condition_different_from(&account_id); - let state_address_2 = rand_state_controller_address_unlock_condition_different_from(&account_id); + let address_1 = rand_address_unlock_condition_different_from_account_id(&account_id); + let address_2 = rand_address_unlock_condition_different_from_account_id(&account_id); let sender_1 = rand_sender_feature(); let sender_2 = rand_sender_feature(); let issuer_1 = rand_issuer_feature(); @@ -37,8 +32,7 @@ fn builder() { let mut builder = AccountOutput::build_with_amount(amount, account_id) .add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) - .add_unlock_condition(gov_address_1.clone()) - .add_unlock_condition(state_address_1.clone()) + .add_unlock_condition(address_1.clone()) .add_feature(sender_1.clone()) .replace_feature(sender_2.clone()) .replace_immutable_feature(issuer_1.clone()) @@ -46,11 +40,7 @@ fn builder() { let output = builder.clone().finish().unwrap(); assert_eq!(output.amount(), amount); - assert_eq!(output.unlock_conditions().governor_address(), Some(&gov_address_1)); - assert_eq!( - output.unlock_conditions().state_controller_address(), - Some(&state_address_1) - ); + assert_eq!(output.unlock_conditions().address(), Some(&address_1)); assert_eq!(output.features().sender(), Some(&sender_2)); assert_eq!(output.immutable_features().issuer(), Some(&issuer_1)); @@ -58,14 +48,9 @@ fn builder() { .clear_unlock_conditions() .clear_features() .clear_immutable_features() - .replace_unlock_condition(gov_address_2.clone()) - .replace_unlock_condition(state_address_2.clone()); + .replace_unlock_condition(address_2.clone()); let output = builder.clone().finish().unwrap(); - assert_eq!(output.unlock_conditions().governor_address(), Some(&gov_address_2)); - assert_eq!( - output.unlock_conditions().state_controller_address(), - Some(&state_address_2) - ); + assert_eq!(output.unlock_conditions().address(), Some(&address_2)); assert!(output.features().is_empty()); assert!(output.immutable_features().is_empty()); @@ -73,10 +58,7 @@ fn builder() { let output = builder .with_minimum_storage_deposit(protocol_parameters.rent_structure()) - .add_unlock_condition(rand_state_controller_address_unlock_condition_different_from( - &account_id, - )) - .add_unlock_condition(rand_governor_address_unlock_condition_different_from(&account_id)) + .add_unlock_condition(rand_address_unlock_condition_different_from_account_id(&account_id)) .with_features([Feature::from(metadata.clone()), sender_1.clone().into()]) .with_immutable_features([Feature::from(metadata.clone()), issuer_1.clone().into()]) .finish_with_params(ValidationParams::default().with_protocol_parameters(protocol_parameters.clone())) diff --git a/sdk/tests/types/transaction.rs b/sdk/tests/types/transaction.rs index 032fcedcfa..81f5e492a1 100644 --- a/sdk/tests/types/transaction.rs +++ b/sdk/tests/types/transaction.rs @@ -5,10 +5,7 @@ use iota_sdk::types::block::{ address::{AccountAddress, Address, Ed25519Address}, input::{Input, UtxoInput}, output::{ - unlock_condition::{ - AddressUnlockCondition, GovernorAddressUnlockCondition, ImmutableAccountAddressUnlockCondition, - StateControllerAddressUnlockCondition, - }, + unlock_condition::{AddressUnlockCondition, ImmutableAccountAddressUnlockCondition}, AccountId, AccountOutput, BasicOutput, ChainId, FoundryId, FoundryOutput, NativeToken, NftId, NftOutput, Output, SimpleTokenScheme, TokenId, TokenScheme, }, @@ -409,8 +406,7 @@ fn duplicate_output_account() { .unwrap(); let account_id = AccountId::from(bytes); let account = AccountOutput::build_with_amount(1_000_000, account_id) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(address.clone())) - .add_unlock_condition(GovernorAddressUnlockCondition::new(address)) + .add_unlock_condition(AddressUnlockCondition::new(address.clone())) .finish_output(protocol_parameters.token_supply()) .unwrap(); diff --git a/sdk/tests/types/transaction_id.rs b/sdk/tests/types/transaction_id.rs index 1e0d2f2445..a6b6190b64 100644 --- a/sdk/tests/types/transaction_id.rs +++ b/sdk/tests/types/transaction_id.rs @@ -56,137 +56,139 @@ fn pack_unpack_valid() { } // TODO: re-enable when source is updated -#[test] -fn transaction_id() { - // Test from https://github.com/iotaledger/tips-draft/blob/tip46/tips/TIP-0046/tip-0046.md#transaction-id - - let transaction_payload_json = serde_json::json!({ - "type": 1, - "transaction": { - "networkId": "14147312347886322761", - "creationSlot": 1048576, - "contextInputs": [ - { - "type": 0, - "commitmentId": "0x760702593b59500420722f3a1634005f11360b133a030f46282c0f690a55084855000000" - }, - { - "type": 1, - "accountId": "0x3407603d0f725b7e7214205f254305743d5362512f36153236435e796b6a1c2e" - }, - { - "type": 2, - "index": 0 - } - ], - "inputs": [ - { - "type": 0, - "transactionId": "0x3ca1f23b83708ee7c59d6d7fe71453106bb0a0abc1c9cc4b340c755238ae6daa00000000", - "transactionOutputIndex": 0 - }, - { - "type": 0, - "transactionId": "0xecb673f194640b2067b8da136b5f5437c2c723e7f3fdaa53984d7588ed21071a00000000", - "transactionOutputIndex": 0 - } - ], - "allotments": [ - { - "accountId": "0x0e0f253479566103415e29060f79772445531564733e214b54084358413f7c70", - "mana": "6648" - }, - { - "accountId": "0x445e204c1f747503106b5663664c43591e63235804057c445d073a5f10597e2d", - "mana": "9988" - } - ], - "capabilities": "0x01", - "outputs": [ - { - "type": 0, - "amount": "100000", - "mana": "0", - "unlockConditions": [ - { - "type": 0, - "address": { - "type": 0, - "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" - } - } - ], - "features": [ - // TODO re-enable with NT PR - // { - // "type": 4, - // "id": "0x082a1c2429352945216e3f547a03226b2f014d3d2e185a2459473a362c4d124d511a6c2d6000", - // "amount": "0xd54f92ae8c34fbb4" - // } - ] - }, - { - "type": 1, - "amount": "100000", - "mana": "5000", - "accountId": "0x0000000000000000000000000000000000000000000000000000000000000000", - "stateIndex": 0, - "foundryCounter": 0, - "unlockConditions": [ - { - "type": 4, - "address": { - "type": 0, - "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" - } - }, - { - "type": 5, - "address": { - "type": 0, - "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" - } - } - ], - "features": [ - { - "type": 2, - "data": "0x1e69562e763b1125080c1a7161390e42" - } - ] - } - ] - }, - "unlocks": [ - { - "type": 0, - "signature": { - "type": 0, - "publicKey": "0xa6bbccb2380a3a941a7bfdd5f2afcb8a6f5236bbe12ae8b931b593efd76864b6", - "signature": "0x98a18fd0083c7d9b6b05e218c7f764bb915148762ce342d795f7acac4083b40dbfc01f5fd23f6d1e652eee0e5951b87dd6307adf1389f8f16c08ade12be01c0a" - } - }, - { - "type": 1, - "reference": 0 - } - ] - }); - - let transaction_payload_dto = - serde_json::from_value::(transaction_payload_json).unwrap(); - let transaction_payload = SignedTransactionPayload::try_from_dto(transaction_payload_dto).unwrap(); - let transaction_payload_bytes = Payload::from(transaction_payload.clone()).pack_to_vec(); - - // assert_eq!( - // prefix_hex::encode(transaction_payload_bytes), - // "0x01490443ee9f5955c400001000030001760702593b59500420722f3a1634005f11360b133a030f46282c0f690a55084855000000023407603d0f725b7e7214205f254305743d5362512f36153236435e796b6a1c2e0300000200003ca1f23b83708ee7c59d6d7fe71453106bb0a0abc1c9cc4b340c755238ae6daa00000000000000ecb673f194640b2067b8da136b5f5437c2c723e7f3fdaa53984d7588ed21071a00000000000002000e0f253479566103415e29060f79772445531564733e214b54084358413f7c70f819000000000000445e204c1f747503106b5663664c43591e63235804057c445d073a5f10597e2d0427000000000000010100000000020000a08601000000000000000000000000000100007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e0104082a1c2429352945216e3f547a03226b2f014d3d2e185a2459473a362c4d124d511a6c2d6000b4fb348cae924fd500000000000000000000000000000000000000000000000001a08601000000000088130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e05007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e010210001e69562e763b1125080c1a7161390e420002000000a6bbccb2380a3a941a7bfdd5f2afcb8a6f5236bbe12ae8b931b593efd76864b698a18fd0083c7d9b6b05e218c7f764bb915148762ce342d795f7acac4083b40dbfc01f5fd23f6d1e652eee0e5951b87dd6307adf1389f8f16c08ade12be01c0a010000" - // ); - - // let transaction_id = transaction_payload.id().to_string(); - - // assert_eq!( - // transaction_id, - // "0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682533" - // ); -} +// #[test] +// fn transaction_id() { +// // Test from https://github.com/iotaledger/tips-draft/blob/tip46/tips/TIP-0046/tip-0046.md#transaction-id + +// let transaction_payload_json = serde_json::json!({ +// "type": 1, +// "transaction": { +// "networkId": "14147312347886322761", +// "creationSlot": 1048576, +// "contextInputs": [ +// { +// "type": 0, +// "commitmentId": "0x760702593b59500420722f3a1634005f11360b133a030f46282c0f690a55084855000000" +// }, +// { +// "type": 1, +// "accountId": "0x3407603d0f725b7e7214205f254305743d5362512f36153236435e796b6a1c2e" +// }, +// { +// "type": 2, +// "index": 0 +// } +// ], +// "inputs": [ +// { +// "type": 0, +// "transactionId": "0x3ca1f23b83708ee7c59d6d7fe71453106bb0a0abc1c9cc4b340c755238ae6daa00000000", +// "transactionOutputIndex": 0 +// }, +// { +// "type": 0, +// "transactionId": "0xecb673f194640b2067b8da136b5f5437c2c723e7f3fdaa53984d7588ed21071a00000000", +// "transactionOutputIndex": 0 +// } +// ], +// "allotments": [ +// { +// "accountId": "0x0e0f253479566103415e29060f79772445531564733e214b54084358413f7c70", +// "mana": "6648" +// }, +// { +// "accountId": "0x445e204c1f747503106b5663664c43591e63235804057c445d073a5f10597e2d", +// "mana": "9988" +// } +// ], +// "capabilities": "0x01", +// "outputs": [ +// { +// "type": 0, +// "amount": "100000", +// "mana": "0", +// "unlockConditions": [ +// { +// "type": 0, +// "address": { +// "type": 0, +// "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" +// } +// } +// ], +// "features": [ +// // TODO re-enable with NT PR +// // { +// // "type": 4, +// // "id": "0x082a1c2429352945216e3f547a03226b2f014d3d2e185a2459473a362c4d124d511a6c2d6000", +// // "amount": "0xd54f92ae8c34fbb4" +// // } +// ] +// }, +// { +// "type": 1, +// "amount": "100000", +// "mana": "5000", +// "accountId": "0x0000000000000000000000000000000000000000000000000000000000000000", +// "stateIndex": 0, +// "foundryCounter": 0, +// "unlockConditions": [ +// { +// "type": 4, +// "address": { +// "type": 0, +// "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" +// } +// }, +// { +// "type": 5, +// "address": { +// "type": 0, +// "pubKeyHash": "0x7f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e" +// } +// } +// ], +// "features": [ +// { +// "type": 2, +// "data": "0x1e69562e763b1125080c1a7161390e42" +// } +// ] +// } +// ] +// }, +// "unlocks": [ +// { +// "type": 0, +// "signature": { +// "type": 0, +// "publicKey": "0xa6bbccb2380a3a941a7bfdd5f2afcb8a6f5236bbe12ae8b931b593efd76864b6", +// "signature": +// "0x98a18fd0083c7d9b6b05e218c7f764bb915148762ce342d795f7acac4083b40dbfc01f5fd23f6d1e652eee0e5951b87dd6307adf1389f8f16c08ade12be01c0a" +// } +// }, +// { +// "type": 1, +// "reference": 0 +// } +// ] +// }); + +// let transaction_payload_dto = +// serde_json::from_value::(transaction_payload_json).unwrap(); +// let transaction_payload = SignedTransactionPayload::try_from_dto(transaction_payload_dto).unwrap(); +// let transaction_payload_bytes = Payload::from(transaction_payload.clone()).pack_to_vec(); + +// // assert_eq!( +// // prefix_hex::encode(transaction_payload_bytes), +// // +// "0x01490443ee9f5955c400001000030001760702593b59500420722f3a1634005f11360b133a030f46282c0f690a55084855000000023407603d0f725b7e7214205f254305743d5362512f36153236435e796b6a1c2e0300000200003ca1f23b83708ee7c59d6d7fe71453106bb0a0abc1c9cc4b340c755238ae6daa00000000000000ecb673f194640b2067b8da136b5f5437c2c723e7f3fdaa53984d7588ed21071a00000000000002000e0f253479566103415e29060f79772445531564733e214b54084358413f7c70f819000000000000445e204c1f747503106b5663664c43591e63235804057c445d073a5f10597e2d0427000000000000010100000000020000a08601000000000000000000000000000100007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e0104082a1c2429352945216e3f547a03226b2f014d3d2e185a2459473a362c4d124d511a6c2d6000b4fb348cae924fd500000000000000000000000000000000000000000000000001a08601000000000088130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e05007f34f61bd0ecd2654a1ec3c9bf3fbc0de91abcbd7397e09faaaffc89d17a8f6e010210001e69562e763b1125080c1a7161390e420002000000a6bbccb2380a3a941a7bfdd5f2afcb8a6f5236bbe12ae8b931b593efd76864b698a18fd0083c7d9b6b05e218c7f764bb915148762ce342d795f7acac4083b40dbfc01f5fd23f6d1e652eee0e5951b87dd6307adf1389f8f16c08ade12be01c0a010000" +// // ); + +// // let transaction_id = transaction_payload.id().to_string(); + +// // assert_eq!( +// // transaction_id, +// // "0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682533" +// // ); +// } diff --git a/sdk/tests/wallet/syncing.rs b/sdk/tests/wallet/syncing.rs index aef258315d..35d0c08fb4 100644 --- a/sdk/tests/wallet/syncing.rs +++ b/sdk/tests/wallet/syncing.rs @@ -3,10 +3,7 @@ use iota_sdk::{ types::block::output::{ - unlock_condition::{ - AddressUnlockCondition, ExpirationUnlockCondition, GovernorAddressUnlockCondition, - StateControllerAddressUnlockCondition, StorageDepositReturnUnlockCondition, - }, + unlock_condition::{AddressUnlockCondition, ExpirationUnlockCondition, StorageDepositReturnUnlockCondition}, AccountId, AccountOutputBuilder, BasicOutputBuilder, NftId, NftOutputBuilder, UnlockCondition, }, wallet::{account::SyncOptions, Result}, @@ -108,12 +105,9 @@ async fn sync_only_most_basic_outputs() -> Result<()> { ]) .finish_output(token_supply)?, AccountOutputBuilder::new_with_amount(1_000_000, AccountId::null()) - .with_unlock_conditions([ - UnlockCondition::StateControllerAddress(StateControllerAddressUnlockCondition::new( - account_1_address.clone(), - )), - UnlockCondition::GovernorAddress(GovernorAddressUnlockCondition::new(account_1_address.clone())), - ]) + .with_unlock_conditions([UnlockCondition::Address(AddressUnlockCondition::new( + account_1_address.clone(), + ))]) .finish_output(token_supply)?, ];