From 1b58ea9a5f4035993bf900c05c2ab2079a19a3d6 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 11:14:02 +0200 Subject: [PATCH 01/56] Add AnchorOutput and AnchorAddress --- cli/src/command/account.rs | 3 + .../api/block_builder/input_selection/mod.rs | 1 + .../input_selection/requirement/sender.rs | 1 + sdk/src/client/secret/ledger_nano.rs | 1 + sdk/src/client/secret/mod.rs | 1 + sdk/src/client/utils.rs | 1 + sdk/src/types/block/address/anchor.rs | 91 ++ sdk/src/types/block/address/mod.rs | 22 + sdk/src/types/block/error.rs | 7 +- sdk/src/types/block/output/anchor.rs | 923 ++++++++++++++++++ sdk/src/types/block/output/chain_id.rs | 8 +- sdk/src/types/block/output/mod.rs | 59 +- .../payload/transaction/essence/regular.rs | 1 + sdk/src/types/block/semantic.rs | 2 + 14 files changed, 1117 insertions(+), 4 deletions(-) create mode 100644 sdk/src/types/block/address/anchor.rs create mode 100644 sdk/src/types/block/output/anchor.rs diff --git a/cli/src/command/account.rs b/cli/src/command/account.rs index 5ea180908c..6c4ec0f01a 100644 --- a/cli/src/command/account.rs +++ b/cli/src/command/account.rs @@ -966,6 +966,9 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), Output::Delegation(_) => { // TODO do we want to log them? } + Output::Anchor(_) => { + // TODO do we want to log them? + } } let unlock_conditions = output_data .output 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 4baa80fc55..e32ba19027 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -81,6 +81,7 @@ impl InputSelection { AccountTransition::State, ))), Address::Nft(nft_address) => Ok(Some(Requirement::Nft(*nft_address.nft_id()))), + Address::Anchor(_) => todo!(), } } 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 9fc5f5267f..ab3d29a08a 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 @@ -48,6 +48,7 @@ impl InputSelection { Err(e) => Err(e), } } + Address::Anchor(_) => todo!(), } } } diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index 409ab571a0..232697d534 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -544,6 +544,7 @@ fn merge_unlocks( merged_unlocks.push(Unlock::Reference(ReferenceUnlock::new(*block_index as u16)?)); } Address::Nft(_nft) => merged_unlocks.push(Unlock::Nft(NftUnlock::new(*block_index as u16)?)), + Address::Anchor(_) => todo!(), }, None => { // We can only sign ed25519 addresses and block_indexes needs to contain the account or nft diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index 67c58865e8..8213da048e 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -532,6 +532,7 @@ where blocks.push(Unlock::Reference(ReferenceUnlock::new(*block_index as u16)?)); } Address::Nft(_nft) => blocks.push(Unlock::Nft(NftUnlock::new(*block_index as u16)?)), + Address::Anchor(_) => todo!(), }, None => { // We can only sign ed25519 addresses and block_indexes needs to contain the account or nft diff --git a/sdk/src/client/utils.rs b/sdk/src/client/utils.rs index bc0b8ec97a..e1da240f6d 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(), }) } diff --git a/sdk/src/types/block/address/anchor.rs b/sdk/src/types/block/address/anchor.rs new file mode 100644 index 0000000000..ffbd15c8b6 --- /dev/null +++ b/sdk/src/types/block/address/anchor.rs @@ -0,0 +1,91 @@ +// Copyright 2023 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use core::str::FromStr; + +use derive_more::{AsRef, Deref, From}; + +use crate::types::block::{output::AnchorId, Error}; + +/// An anchor address. +#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, packable::Packable)] +#[as_ref(forward)] +pub struct AnchorAddress(AnchorId); + +impl AnchorAddress { + /// The [`Address`](crate::types::block::address::Address) kind of an [`AnchorAddress`]. + /// TODO + pub const KIND: u8 = 255; + /// 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 core::fmt::Display for AnchorAddress { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{}", self.0) + } +} + +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) + } + } + + impl_serde_typed_dto!(AnchorAddress, AnchorAddressDto, "anchor address"); +} diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index a870d399b7..9d5ab8c761 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 nft; @@ -10,6 +11,7 @@ use derive_more::From; pub use self::{ account::AccountAddress, + anchor::AnchorAddress, bech32::{Bech32Address, Hrp}, ed25519::Ed25519Address, nft::NftAddress, @@ -37,6 +39,9 @@ pub enum Address { /// An NFT address. #[packable(tag = NftAddress::KIND)] Nft(NftAddress), + /// An anchor address. + #[packable(tag = AnchorAddress::KIND)] + Anchor(AnchorAddress), } impl core::fmt::Debug for Address { @@ -45,6 +50,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), } } } @@ -56,6 +62,7 @@ impl Address { Self::Ed25519(_) => Ed25519Address::KIND, Self::Account(_) => AccountAddress::KIND, Self::Nft(_) => NftAddress::KIND, + Self::Anchor(_) => AnchorAddress::KIND, } } @@ -104,6 +111,21 @@ impl Address { } } + /// Checks whether the address is an [`AnchorAddress`]. + pub fn is_anchor(&self) -> bool { + matches!(self, Self::Anchor(_)) + } + + /// Gets the address as an actual [`AnchorAddress`]. + /// PANIC: do not call on a non-anchor address. + pub fn as_anchor(&self) -> &AnchorAddress { + if let Self::Anchor(address) = self { + address + } else { + panic!("as_anchor called on a non-anchor address"); + } + } + /// Tries to create an [`Address`] from a bech32 encoded string. pub fn try_from_bech32(address: impl AsRef) -> Result { Bech32Address::try_from_str(address).map(|res| res.inner) diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index 0ac9c990b0..b7cc02e0b0 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -16,7 +16,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}, @@ -150,7 +150,9 @@ pub enum Error { }, BlockIssuerKeysNotUniqueSorted, RemainingBytesAfterBlock, + // TODO remove? SelfControlledAccountOutput(AccountId), + SelfControlledAnchorOutput(AnchorId), SelfDepositNft(NftId), SignaturePublicKeyMismatch { expected: String, @@ -346,6 +348,9 @@ impl fmt::Display for Error { 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}") } diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs new file mode 100644 index 0000000000..7b8263d9bf --- /dev/null +++ b/sdk/src/types/block/output/anchor.rs @@ -0,0 +1,923 @@ +// Copyright 2021 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, + }, + protocol::ProtocolParameters, + semantic::{TransactionFailureReason, ValidationContext}, + unlock::Unlock, + Error, + }, + ValidationParams, +}; + +impl_id!(pub AnchorId, 32, "Unique identifier of an anchor, which is the BLAKE2b-256 hash of the Output ID that created it."); + +#[cfg(feature = "serde")] +string_serde_impl!(AnchorId); + +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, + unlock_conditions: UnlockConditions, + // + features: Features, + // + 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, + inputs: &[(&OutputId, &Output)], + context: &mut ValidationContext<'_>, + ) -> 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, inputs, context)?; + } else { + self.state_controller_address().unlock(unlock, inputs, 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, inputs, 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: &ValidationContext<'_>) -> 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: &ValidationContext<'_>, + ) -> Result<(), StateTransitionError> { + Self::transition_inner( + current_state, + next_state, + &context.input_chains, + context.essence.outputs(), + ) + } + + fn destruction(_current_state: &Self, _context: &ValidationContext<'_>) -> Result<(), StateTransitionError> { + 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, FoundryId, SimpleTokenScheme, TokenId}, +// protocol::protocol_parameters, +// rand::{ +// address::rand_anchor_address, +// output::{ +// feature::rand_allowed_features, +// rand_account_output, rand_anchor_id, +// 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_account_output(protocol_parameters.token_supply()); +// let dto = OutputDto::Account((&output).into()); +// let output_unver = Output::try_from_dto(dto.clone()).unwrap(); +// assert_eq!(&output, output_unver.as_account()); +// let output_ver = Output::try_from_dto_with_params(dto, &protocol_parameters).unwrap(); +// assert_eq!(&output, output_ver.as_account()); + +// 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 foundry_id = FoundryId::build(&rand_anchor_address(), 0, SimpleTokenScheme::KIND); +// 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_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) +// .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); + +// let builder = AnchorOutput::build_with_minimum_storage_deposit(protocol_parameters.rent_structure(), +// anchor_id) .add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) +// .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 c9829eb5a0..33f293d56e 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 inputs_commitment; @@ -43,6 +44,7 @@ pub(crate) use self::{ }; pub use self::{ account::{AccountId, AccountOutput, AccountOutputBuilder, AccountTransition}, + anchor::{AnchorId, AnchorOutput, AnchorTransition}, basic::{BasicOutput, BasicOutputBuilder}, chain_id::ChainId, delegation::{DelegationId, DelegationOutput, DelegationOutputBuilder}, @@ -123,6 +125,8 @@ pub enum Output { Nft(NftOutput), /// A delegation output. Delegation(DelegationOutput), + /// An anchor output. + Anchor(AnchorOutput), } impl core::fmt::Debug for Output { @@ -133,6 +137,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), } } } @@ -149,6 +154,7 @@ impl Output { Self::Foundry(_) => FoundryOutput::KIND, Self::Nft(_) => NftOutput::KIND, Self::Delegation(_) => DelegationOutput::KIND, + Self::Anchor(_) => AnchorOutput::KIND, } } @@ -160,6 +166,7 @@ impl Output { Self::Foundry(_) => "Foundry", Self::Nft(_) => "Nft", Self::Delegation(_) => "Delegation", + Self::Anchor(_) => "Anchor", } } @@ -171,6 +178,7 @@ impl Output { Self::Foundry(output) => output.amount(), Self::Nft(output) => output.amount(), Self::Delegation(output) => output.amount(), + Self::Anchor(output) => output.amount(), } } @@ -182,6 +190,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()), } } @@ -193,6 +202,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()), } } @@ -204,6 +214,7 @@ impl Output { Self::Foundry(output) => Some(output.features()), Self::Nft(output) => Some(output.features()), Self::Delegation(_) => None, + Self::Anchor(output) => Some(output.features()), } } @@ -215,6 +226,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()), } } @@ -226,6 +238,7 @@ 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()), } } @@ -304,6 +317,21 @@ impl Output { } } + /// Checks whether the output is a [`AnchorOutput`]. + pub fn is_anchor(&self) -> bool { + matches!(self, Self::Anchor(_)) + } + + /// Gets the output as an actual [`AnchorOutput`]. + /// NOTE: Will panic if the output is not a [`AnchorOutput`]. + pub fn as_anchor(&self) -> &AnchorOutput { + if let Self::Anchor(output) = self { + output + } else { + panic!("invalid downcast of non-AnchorOutput"); + } + } + /// 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. /// If no `account_transition` has been provided, assumes a state transition. @@ -338,6 +366,17 @@ impl Output { *output.unlock_conditions().locked_address(output.address(), slot_index), None, )), + Self::Anchor(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(), + Some(Address::Anchor(output.anchor_address(output_id))), + )) + } else { + Ok((*output.governor_address(), None)) + } + } } } @@ -448,6 +487,10 @@ impl Packable for Output { DelegationOutput::KIND.pack(packer)?; output.pack(packer) } + Self::Anchor(output) => { + AnchorOutput::KIND.pack(packer)?; + output.pack(packer) + } }?; Ok(()) @@ -463,6 +506,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(Error::InvalidOutputKind(k)).map_err(UnpackError::Packable), }) } @@ -526,8 +570,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}; @@ -539,6 +583,7 @@ pub mod dto { Foundry(FoundryOutputDto), Nft(NftOutputDto), Delegation(DelegationOutputDto), + Anchor(AnchorOutputDto), } impl From<&Output> for OutputDto { @@ -549,6 +594,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()), } } } @@ -566,6 +612,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)?), }) } } @@ -600,6 +647,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")), }, ) @@ -619,6 +670,7 @@ pub mod dto { T4(&'a FoundryOutputDto), T5(&'a NftOutputDto), T6(&'a DelegationOutputDto), + T7(&'a AnchorOutputDto), } #[derive(Serialize)] struct TypedOutput<'a> { @@ -641,6 +693,9 @@ pub mod dto { Self::Delegation(o) => TypedOutput { output: OutputDto_::T6(o), }, + Self::Anchor(o) => TypedOutput { + output: OutputDto_::T7(o), + }, }; output.serialize(serializer) } diff --git a/sdk/src/types/block/payload/transaction/essence/regular.rs b/sdk/src/types/block/payload/transaction/essence/regular.rs index c21dfb0ddd..7f688c7526 100644 --- a/sdk/src/types/block/payload/transaction/essence/regular.rs +++ b/sdk/src/types/block/payload/transaction/essence/regular.rs @@ -368,6 +368,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 diff --git a/sdk/src/types/block/semantic.rs b/sdk/src/types/block/semantic.rs index b98b916bcb..057bdae549 100644 --- a/sdk/src/types/block/semantic.rs +++ b/sdk/src/types/block/semantic.rs @@ -268,6 +268,7 @@ pub fn semantic_validation( None, output.unlock_conditions(), ), + Output::Anchor(_) => todo!(), }; if let Err(conflict) = conflict { @@ -325,6 +326,7 @@ pub fn semantic_validation( Output::Foundry(output) => (output.amount(), Some(output.native_tokens()), Some(output.features())), Output::Nft(output) => (output.amount(), Some(output.native_tokens()), Some(output.features())), Output::Delegation(output) => (output.amount(), None, None), + Output::Anchor(_) => todo!(), }; if let Some(sender) = features.and_then(|f| f.sender()) { From b6974bb21a2496dc8a06644b5339782584bdbae5 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 12:13:15 +0200 Subject: [PATCH 02/56] Start removing account transitions --- .../api/block_builder/input_selection/mod.rs | 50 ++-- .../input_selection/remainder.rs | 2 +- .../input_selection/requirement/account.rs | 33 +-- .../input_selection/requirement/amount.rs | 17 +- .../input_selection/requirement/ed25519.rs | 34 +-- .../input_selection/requirement/foundry.rs | 6 +- .../input_selection/requirement/issuer.rs | 10 +- .../input_selection/requirement/mod.rs | 23 +- .../requirement/native_tokens.rs | 8 +- .../input_selection/requirement/nft.rs | 9 +- .../input_selection/requirement/sender.rs | 14 +- .../input_selection/transition.rs | 26 +-- sdk/src/client/secret/ledger_nano.rs | 8 +- sdk/src/client/secret/mod.rs | 8 +- sdk/src/types/block/output/account.rs | 218 ++++++------------ sdk/src/types/block/output/mod.rs | 30 +-- .../wallet/account/operations/helpers/time.rs | 9 +- .../account/operations/output_claiming.rs | 2 - .../operations/output_consolidation.rs | 2 +- .../burning_melting/melt_native_token.rs | 3 +- .../transaction/high_level/create_account.rs | 1 - .../high_level/minting/create_native_token.rs | 3 +- .../high_level/minting/mint_native_token.rs | 5 +- .../operations/transaction/input_selection.rs | 2 +- sdk/src/wallet/account/types/mod.rs | 6 +- 25 files changed, 165 insertions(+), 364 deletions(-) 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 e32ba19027..797afd1bc7 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -10,7 +10,7 @@ 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; @@ -22,8 +22,7 @@ use crate::{ address::{AccountAddress, Address, 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, }, protocol::ProtocolParameters, slot::SlotIndex, @@ -43,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. @@ -63,7 +62,7 @@ impl InputSelection { 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 { @@ -76,23 +75,16 @@ impl InputSelection { Ok(None) } } - Address::Account(account_address) => Ok(Some(Requirement::Account( - *account_address.account_id(), - AccountTransition::State, - ))), + 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(_) => todo!(), } } - 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 @@ -141,7 +133,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)), } @@ -190,7 +182,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(), } } @@ -246,7 +238,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; @@ -276,7 +268,7 @@ impl InputSelection { ); 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,10 +277,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) => { @@ -335,7 +326,7 @@ impl InputSelection { ); 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(); @@ -384,8 +375,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)?; } } @@ -474,15 +465,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 5b2e39caa9..9a6294516f 100644 --- a/sdk/src/client/api/block_builder/input_selection/remainder.rs +++ b/sdk/src/client/api/block_builder/input_selection/remainder.rs @@ -36,7 +36,7 @@ impl InputSelection { // 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; 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..bcb137501a 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 @@ -4,7 +4,7 @@ use super::{Error, InputSelection, Requirement}; use crate::{ client::{api::input_selection::Burn, secret::types::InputSigningData}, - types::block::output::{AccountId, AccountTransition, Output, OutputId}, + types::block::output::{AccountId, Output, OutputId}, }; pub(crate) fn is_account_transition<'a>( @@ -62,8 +62,7 @@ impl InputSelection { pub(crate) fn fulfill_account_requirement( &mut self, account_id: AccountId, - account_transition: AccountTransition, - ) -> Result)>, Error> { + ) -> Result, Error> { // Check that the account is not burned when a state transition is required. if account_transition.is_state() && self @@ -71,10 +70,7 @@ impl InputSelection { .as_ref() .map_or(false, |burn| burn.accounts.contains(&account_id)) { - return Err(Error::UnfulfillableRequirement(Requirement::Account( - account_id, - account_transition, - ))); + return Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))); } let selected_input = self @@ -86,7 +82,7 @@ impl InputSelection { // be performed. if !account_transition.is_state() && selected_input.is_some() { log::debug!( - "{account_id:?}/{account_transition:?} requirement already fulfilled by {:?}", + "{account_id:?} requirement already fulfilled by {:?}", selected_input.unwrap().output_id() ); return Ok(Vec::new()); @@ -99,10 +95,7 @@ impl InputSelection { // 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, - ))); + return Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))); } // If a state transition is not required, we can simply select the account. @@ -116,7 +109,7 @@ impl InputSelection { ); // 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)]); + return Ok(vec![input]); } // At this point, a state transition is required so we need to verify that an account output describing a @@ -128,26 +121,20 @@ impl InputSelection { 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, - ))); + return Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))); } 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() - ); + log::debug!("{account_id:?} requirement fulfilled by {:?}", input.output_id()); - return Ok(vec![(input, None)]); + return Ok(vec![input]); } log::debug!( - "{account_id:?}/{account_transition:?} requirement already fulfilled by {:?}", + "{account_id:?} requirement already fulfilled by {:?}", selected_input.unwrap().output_id() ); 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 549bc43e62..9ec97f5926 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() } } @@ -280,9 +279,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 +348,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 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 f9d56c91e1..cc8613b08c 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 @@ -2,10 +2,7 @@ // 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 crate::{client::secret::types::InputSigningData, types::block::address::Address}; impl InputSelection { // Checks if a selected input unlocks a given ED25519 address. @@ -20,7 +17,7 @@ impl InputSelection { // 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; @@ -35,41 +32,34 @@ impl InputSelection { // 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) { + fn available_has_ed25519_address(&self, input: &InputSigningData, address: &Address) -> bool { 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)); + return self.addresses.contains(address); } // 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)); + return self.addresses.contains(address); } - (false, None) + false } else { let (required_address, _) = input .output - .required_and_unlocked_address(self.slot_index, input.output_id(), None) + .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,7 +78,7 @@ 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)) } else { @@ -96,7 +86,7 @@ impl InputSelection { 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)) + Some(index) } else { None } @@ -117,7 +107,7 @@ impl InputSelection { account_transition ); - Ok(vec![(input, account_transition)]) + Ok(vec![input]) } None => Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address))), } 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 425811c5fa..61ddf76cc3 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 383e17a1cf..8cdec50185 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 @@ -17,7 +17,7 @@ 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 +32,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 +45,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 +53,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 +72,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 +109,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 +148,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 ab3d29a08a..d9d5182319 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))) } Err(e) => Err(e), 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..65048defe2 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); @@ -67,10 +66,9 @@ impl InputSelection { 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 +106,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 +144,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 +153,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/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index 232697d534..8ab0f5eb1e 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -527,11 +527,9 @@ fn merge_unlocks( // Get the address that is required to unlock the input let TransactionEssence::Regular(regular) = &prepared_transaction_data.essence; let account_transition = is_account_transition(&input.output, *input.output_id(), regular.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) { diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index 8213da048e..f58cb7722b 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -517,11 +517,9 @@ where // Get the address that is required to unlock the input let TransactionEssence::Regular(regular) = &prepared_transaction_data.essence; let account_transition = is_account_transition(&input.output, *input.output_id(), regular.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) { diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 5e1d832928..1b70e8ff6f 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -57,37 +57,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] @@ -96,7 +65,6 @@ pub struct AccountOutputBuilder { mana: u64, native_tokens: BTreeSet, account_id: AccountId, - state_index: Option, state_metadata: Vec, foundry_counter: Option, unlock_conditions: BTreeSet, @@ -122,7 +90,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(), @@ -173,13 +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 { @@ -280,7 +240,6 @@ 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 @@ -289,7 +248,7 @@ impl AccountOutputBuilder { .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)?; @@ -308,7 +267,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, @@ -355,7 +313,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(), @@ -377,8 +334,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. @@ -396,8 +351,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`]. @@ -448,12 +402,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] { @@ -486,20 +434,10 @@ impl AccountOutput { /// #[inline(always)] - pub fn state_controller_address(&self) -> &Address { - // An AccountOutput must have a StateControllerAddressUnlockCondition. + pub fn address(&self) -> &Address { + // An AccountOutput must have a, AddressUnlockCondition. 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. - self.unlock_conditions - .governor_address() + .address() .map(|unlock_condition| unlock_condition.address()) .unwrap() } @@ -523,30 +461,19 @@ impl AccountOutput { inputs: &[(&OutputId, &Output)], context: &mut ValidationContext<'_>, ) -> Result<(), TransactionFailureReason> { + self.unlock_conditions() + .locked_address(self.address(), context.essence.creation_slot()) + .unlock(unlock, inputs, 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, inputs, context)?; - } else { - self.state_controller_address().unlock(unlock, inputs, 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, inputs, 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(()) } @@ -562,57 +489,55 @@ 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 - } - } else { - None - } - }); - - let mut created_foundries_count = 0; - - 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 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, - }); - } + // TODO + // if next_state.state_index == current_state.state_index + 1 { + // // 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; + + // 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 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, + // }); + // } Ok(()) } @@ -660,7 +585,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)?; @@ -682,14 +606,13 @@ 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)?; @@ -716,7 +639,6 @@ impl Packable for AccountOutput { mana, native_tokens, account_id, - state_index, state_metadata, foundry_counter, unlock_conditions, @@ -727,8 +649,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(()) @@ -787,7 +709,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, @@ -806,7 +727,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::<_>(), @@ -823,7 +743,6 @@ 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) @@ -845,7 +764,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, @@ -866,10 +784,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); } @@ -935,7 +849,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(), @@ -957,7 +870,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(), diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index 33f293d56e..419f1506ed 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -43,7 +43,7 @@ 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, @@ -339,24 +339,16 @@ impl Output { &self, slot_index: SlotIndex, output_id: &OutputId, - account_transition: Option, ) -> Result<(Address, Option
), Error> { match self { Self::Basic(output) => Ok(( *output.unlock_conditions().locked_address(output.address(), slot_index), 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(), - Some(Address::Account(output.account_address(output_id))), - )) - } else { - Ok((*output.governor_address(), None)) - } - } + Self::Account(output) => Ok(( + *output.unlock_conditions().locked_address(output.address(), slot_index), + Some(Address::Account(output.account_address(output_id))), + )), Self::Foundry(output) => Ok((Address::Account(*output.account_address()), None)), Self::Nft(output) => Ok(( *output.unlock_conditions().locked_address(output.address(), slot_index), @@ -366,17 +358,7 @@ impl Output { *output.unlock_conditions().locked_address(output.address(), slot_index), None, )), - Self::Anchor(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(), - Some(Address::Anchor(output.anchor_address(output_id))), - )) - } else { - Ok((*output.governor_address(), None)) - } - } + Self::Anchor(output) => todo!(), } } 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 66192f018a..104f019d37 100644 --- a/sdk/src/wallet/account/operations/output_claiming.rs +++ b/sdk/src/wallet/account/operations/output_claiming.rs @@ -71,8 +71,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 d27feae1ce..b517d090ec 100644 --- a/sdk/src/wallet/account/operations/output_consolidation.rs +++ b/sdk/src/wallet/account/operations/output_consolidation.rs @@ -97,7 +97,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 242e329164..27b7949e70 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 @@ -61,10 +61,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 6a5a4b2310..5cb1be912f 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 @@ -94,7 +94,6 @@ 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)) .add_unlock_condition(GovernorAddressUnlockCondition::new(controller_address)); 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 8e7c71997e..6e79bc2a7a 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 @@ -140,10 +140,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 6fa5103052..d6bc95d4d0 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 @@ -111,9 +111,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 7674e1eeaf..69731b7101 100644 --- a/sdk/src/wallet/account/operations/transaction/input_selection.rs +++ b/sdk/src/wallet/account/operations/transaction/input_selection.rs @@ -259,7 +259,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 fa22cd1b14..f32b5cc0a5 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::response::OutputWithMetadataResponse, block::{ address::Address, - output::{dto::OutputDto, AccountTransition, Output, OutputId, OutputMetadata}, + output::{dto::OutputDto, Output, OutputId, OutputMetadata}, payload::transaction::{dto::TransactionPayloadDto, TransactionId, TransactionPayload}, 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 From ad917017551ab0e37da9a69bd14819b3655c02b0 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 12:27:34 +0200 Subject: [PATCH 03/56] More changes --- .../api/block_builder/input_selection/mod.rs | 26 +-------------- .../input_selection/remainder.rs | 7 ---- .../input_selection/requirement/account.rs | 33 +------------------ .../input_selection/requirement/amount.rs | 17 ++-------- .../input_selection/requirement/ed25519.rs | 30 ++++------------- .../input_selection/requirement/mod.rs | 1 - .../input_selection/transition.rs | 4 --- sdk/src/client/secret/ledger_nano.rs | 2 -- sdk/src/client/secret/mod.rs | 5 +-- .../operations/transaction/input_selection.rs | 5 +-- 10 files changed, 14 insertions(+), 116 deletions(-) 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 797afd1bc7..734b410523 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -13,7 +13,6 @@ use core::ops::Deref; 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::{ @@ -58,23 +57,13 @@ 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())? .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::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(_) => todo!(), @@ -260,12 +249,6 @@ 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()) @@ -276,7 +259,6 @@ 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())?; @@ -318,12 +300,6 @@ 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()) 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 9a6294516f..19a301f8d5 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}, }, @@ -27,12 +26,6 @@ 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(), - ); // PANIC: safe to unwrap as outputs with no address have been filtered out already. let required_address = input .output 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 bcb137501a..5b5e600f15 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,41 +3,10 @@ use super::{Error, InputSelection, Requirement}; use crate::{ - client::{api::input_selection::Burn, secret::types::InputSigningData}, + 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); - } - } - } - None -} - /// Checks if an output is an account with a given non null account ID. /// Calling it with a null account ID may lead to undefined behavior. pub(crate) fn is_account_with_id_non_null(output: &Output, account_id: &AccountId) -> bool { 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 9ec97f5926..947ec23d4b 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 @@ -221,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) }); @@ -386,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 cc8613b08c..d42dbf228d 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,19 +1,12 @@ // Copyright 2023 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use super::{account::is_account_transition, Error, InputSelection, Requirement}; +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 @@ -21,18 +14,13 @@ impl InputSelection { .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 { + // TODO remove? 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(); @@ -80,12 +68,12 @@ impl InputSelection { .enumerate() .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) { + if self.available_has_ed25519_address(input, &address) { Some(index) } else { None @@ -97,15 +85,11 @@ impl InputSelection { }; 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]) } 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 8cdec50185..fe8ae6af56 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,7 +10,6 @@ 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::{ 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 65048defe2..8db48d2d69 100644 --- a/sdk/src/client/api/block_builder/input_selection/transition.rs +++ b/sdk/src/client/api/block_builder/input_selection/transition.rs @@ -60,10 +60,6 @@ impl InputSelection { .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)); diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index 8ab0f5eb1e..b597fb79aa 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -22,7 +22,6 @@ use tokio::sync::Mutex; use super::{GenerateAddressOptions, SecretManage, SecretManagerConfig}; use crate::{ client::secret::{ - is_account_transition, types::{LedgerApp, LedgerDeviceType}, LedgerNanoStatus, PreparedTransactionData, }, @@ -526,7 +525,6 @@ fn merge_unlocks( for (current_block_index, input) in prepared_transaction_data.inputs_data.iter().enumerate() { // Get the address that is required to unlock the input let TransactionEssence::Regular(regular) = &prepared_transaction_data.essence; - let account_transition = is_account_transition(&input.output, *input.output_id(), regular.outputs(), None); let (input_address, _) = input .output .required_and_unlocked_address(slot_index, input.output_metadata.output_id())?; diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index f58cb7722b..27e42032a5 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -45,8 +45,7 @@ use crate::client::secret::types::StrongholdDto; use crate::{ client::{ api::{ - input_selection::{is_account_transition, Error as InputSelectionError}, - transaction::validate_transaction_payload_length, + input_selection::Error as InputSelectionError, transaction::validate_transaction_payload_length, verify_semantic, PreparedTransactionData, }, Error, @@ -515,8 +514,6 @@ 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 TransactionEssence::Regular(regular) = &prepared_transaction_data.essence; - let account_transition = is_account_transition(&input.output, *input.output_id(), regular.outputs(), None); let (input_address, _) = input .output .required_and_unlocked_address(slot_index, input.output_metadata.output_id())?; diff --git a/sdk/src/wallet/account/operations/transaction/input_selection.rs b/sdk/src/wallet/account/operations/transaction/input_selection.rs index 69731b7101..0c1f49286e 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::{ @@ -256,9 +256,6 @@ 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)? { available_outputs_signing_data.push(available_input); } From a7e6b55169cfd6f0e5f40b4c06cb214b406cae65 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 13:54:34 +0200 Subject: [PATCH 04/56] Remove state_metadata --- sdk/src/types/block/output/account.rs | 40 +------------------ .../transaction/high_level/create_account.rs | 9 ----- 2 files changed, 2 insertions(+), 47 deletions(-) diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 1b70e8ff6f..09d59b5dd1 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -65,7 +65,6 @@ pub struct AccountOutputBuilder { mana: u64, native_tokens: BTreeSet, account_id: AccountId, - state_metadata: Vec, foundry_counter: Option, unlock_conditions: BTreeSet, features: BTreeSet, @@ -90,7 +89,6 @@ impl AccountOutputBuilder { mana: Default::default(), native_tokens: BTreeSet::new(), account_id, - state_metadata: Vec::new(), foundry_counter: None, unlock_conditions: BTreeSet::new(), features: BTreeSet::new(), @@ -140,13 +138,6 @@ impl AccountOutputBuilder { 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 { @@ -242,12 +233,6 @@ impl AccountOutputBuilder { pub fn finish(self) -> Result { 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, foundry_counter)?; let unlock_conditions = UnlockConditions::from_set(self.unlock_conditions)?; @@ -267,7 +252,6 @@ impl AccountOutputBuilder { mana: self.mana, native_tokens: NativeTokens::from_set(self.native_tokens)?, account_id: self.account_id, - state_metadata, foundry_counter, unlock_conditions, features, @@ -313,7 +297,6 @@ impl From<&AccountOutput> for AccountOutputBuilder { mana: output.mana, native_tokens: output.native_tokens.iter().copied().collect(), account_id: output.account_id, - 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(), @@ -334,8 +317,6 @@ pub struct AccountOutput { native_tokens: NativeTokens, // Unique identifier of the account. account_id: AccountId, - // 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, @@ -402,12 +383,6 @@ impl AccountOutput { self.account_id.or_from_output_id(output_id) } - /// - #[inline(always)] - pub fn state_metadata(&self) -> &[u8] { - &self.state_metadata - } - /// #[inline(always)] pub fn foundry_counter(&self) -> u32 { @@ -585,7 +560,6 @@ impl Packable for AccountOutput { self.mana.pack(packer)?; self.native_tokens.pack(packer)?; self.account_id.pack(packer)?; - self.state_metadata.pack(packer)?; self.foundry_counter.pack(packer)?; self.unlock_conditions.pack(packer)?; self.features.pack(packer)?; @@ -639,7 +613,6 @@ impl Packable for AccountOutput { mana, native_tokens, account_id, - state_metadata, foundry_counter, unlock_conditions, features, @@ -683,7 +656,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}; @@ -693,7 +665,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. @@ -709,8 +681,6 @@ pub(crate) mod dto { #[serde(skip_serializing_if = "Vec::is_empty", default)] pub native_tokens: Vec, pub account_id: AccountId, - #[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)] @@ -727,7 +697,6 @@ pub(crate) mod dto { mana: value.mana(), native_tokens: value.native_tokens().to_vec(), account_id: *value.account_id(), - 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(), @@ -746,8 +715,7 @@ pub(crate) mod dto { .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)?); @@ -784,10 +752,6 @@ pub(crate) mod dto { builder = builder.with_native_tokens(native_tokens); } - 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); } 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 5cb1be912f..718bc7b53b 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 @@ -30,9 +30,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 @@ -100,7 +97,6 @@ where if let Some(CreateAccountParams { immutable_metadata, metadata, - state_metadata, .. }) = params { @@ -111,9 +107,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)?]; @@ -158,7 +151,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(); @@ -169,7 +161,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(); From ffa9907adfb5ffe7a0a956014e14ee3dd0d3ec47 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 16:39:08 +0200 Subject: [PATCH 05/56] More changes --- bindings/core/src/method/client.rs | 2 - bindings/core/src/method_handler/client.rs | 4 - cli/src/command/account.rs | 2 +- sdk/Cargo.toml | 10 -- .../client/output/build_account_output.rs | 1 - .../how_tos/account/governance_transition.rs | 82 ----------------- .../how_tos/account/state_transition.rs | 79 ---------------- .../api/block_builder/input_selection/mod.rs | 3 +- .../input_selection/requirement/account.rs | 91 ++++--------------- .../input_selection/transition.rs | 2 +- sdk/src/client/secret/ledger_nano.rs | 1 - sdk/src/types/block/output/account.rs | 10 +- sdk/src/types/block/output/mod.rs | 2 +- .../operations/transaction/input_selection.rs | 4 - 14 files changed, 26 insertions(+), 267 deletions(-) delete mode 100644 sdk/examples/how_tos/account/governance_transition.rs delete mode 100644 sdk/examples/how_tos/account/state_transition.rs diff --git a/bindings/core/src/method/client.rs b/bindings/core/src/method/client.rs index 3488f4f04e..35ede1ae18 100644 --- a/bindings/core/src/method/client.rs +++ b/bindings/core/src/method/client.rs @@ -38,8 +38,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 bfae35f84b..22f33250c1 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/cli/src/command/account.rs b/cli/src/command/account.rs index 6c4ec0f01a..0a0189ebe0 100644 --- a/cli/src/command/account.rs +++ b/cli/src/command/account.rs @@ -952,7 +952,7 @@ 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() { diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index eda2106ca9..d373f9898a 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -349,16 +349,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 a4c22583b5..656546e53c 100644 --- a/sdk/examples/client/output/build_account_output.rs +++ b/sdk/examples/client/output/build_account_output.rs @@ -44,7 +44,6 @@ 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)) .add_feature(MetadataFeature::new(metadata)?) .add_immutable_feature(IssuerFeature::new(address)) 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/src/client/api/block_builder/input_selection/mod.rs b/sdk/src/client/api/block_builder/input_selection/mod.rs index 734b410523..342e01e384 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -239,7 +239,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 @@ -376,7 +375,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, }) 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 5b5e600f15..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 @@ -7,20 +7,20 @@ use crate::{ types::block::output::{AccountId, Output, OutputId}, }; -/// Checks if an output is an account with a given non null account ID. -/// Calling it with a null account ID may lead to undefined behavior. -pub(crate) fn is_account_with_id_non_null(output: &Output, account_id: &AccountId) -> bool { +/// 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() == account_id + &account.account_id_non_null(output_id) == account_id } else { false } } -/// 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 { +/// Checks if an output is an account with a given non null account ID. +/// Calling it with a null account ID may lead to undefined behavior. +pub(crate) fn is_account_with_id_non_null(output: &Output, account_id: &AccountId) -> bool { if let Output::Account(account) = output { - &account.account_id_non_null(output_id) == account_id + account.account_id() == account_id } else { false } @@ -32,81 +32,30 @@ impl InputSelection { &mut self, account_id: AccountId, ) -> 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))); - } - - let selected_input = self + // 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:?} requirement already fulfilled by {:?}", - selected_input.unwrap().output_id() + 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))); - } - - // 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]); - } - - // 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))); - } - - 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:?} requirement fulfilled by {:?}", input.output_id()); - - return Ok(vec![input]); - } + .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:?} 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/transition.rs b/sdk/src/client/api/block_builder/input_selection/transition.rs index 8db48d2d69..84213bb246 100644 --- a/sdk/src/client/api/block_builder/input_selection/transition.rs +++ b/sdk/src/client/api/block_builder/input_selection/transition.rs @@ -55,7 +55,7 @@ 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); diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index b597fb79aa..bc80d023cf 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -524,7 +524,6 @@ 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 TransactionEssence::Regular(regular) = &prepared_transaction_data.essence; let (input_address, _) = input .output .required_and_unlocked_address(slot_index, input.output_metadata.output_id())?; diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 09d59b5dd1..25463a7da4 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, }; @@ -457,8 +456,8 @@ impl AccountOutput { pub(crate) fn transition_inner( current_state: &Self, next_state: &Self, - input_chains: &HashMap, - outputs: &[Output], + _input_chains: &HashMap, + _outputs: &[Output], ) -> Result<(), StateTransitionError> { if current_state.immutable_features != next_state.immutable_features { return Err(StateTransitionError::MutatedImmutableField); @@ -580,8 +579,6 @@ impl Packable for AccountOutput { let native_tokens = NativeTokens::unpack::<_, VERIFY>(unpacker, &())?; let account_id = AccountId::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()?; @@ -732,7 +729,6 @@ pub(crate) mod dto { mana: u64, native_tokens: Option>, account_id: &AccountId, - state_metadata: Option>, foundry_counter: Option, unlock_conditions: Vec, features: Option>, @@ -813,7 +809,6 @@ mod tests { output.mana(), Some(output.native_tokens().to_vec()), output.account_id(), - output.state_metadata().to_owned().into(), output.foundry_counter().into(), output.unlock_conditions().iter().map(Into::into).collect(), Some(output.features().to_vec()), @@ -834,7 +829,6 @@ mod tests { builder.mana, Some(builder.native_tokens.iter().copied().collect()), &builder.account_id, - builder.state_metadata.to_owned().into(), builder.foundry_counter, builder.unlock_conditions.iter().map(Into::into).collect(), Some(builder.features.iter().cloned().collect()), diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index 419f1506ed..bdb5902b45 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -358,7 +358,7 @@ impl Output { *output.unlock_conditions().locked_address(output.address(), slot_index), None, )), - Self::Anchor(output) => todo!(), + Self::Anchor(_) => todo!(), } } diff --git a/sdk/src/wallet/account/operations/transaction/input_selection.rs b/sdk/src/wallet/account/operations/transaction/input_selection.rs index 0c1f49286e..52f258d62f 100644 --- a/sdk/src/wallet/account/operations/transaction/input_selection.rs +++ b/sdk/src/wallet/account/operations/transaction/input_selection.rs @@ -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> { From 72bfa5efacf915f88b554ee8ba68febf2de08a7d Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 16:53:10 +0200 Subject: [PATCH 06/56] It compiles!!! --- .../client/input_selection/account_outputs.rs | 214 +----------------- .../client/input_selection/basic_outputs.rs | 2 - sdk/tests/client/input_selection/burn.rs | 29 +-- .../client/input_selection/expiration.rs | 1 - .../client/input_selection/foundry_outputs.rs | 47 +--- sdk/tests/client/input_selection/outputs.rs | 1 - .../input_selection/storage_deposit_return.rs | 2 - sdk/tests/client/mod.rs | 5 - sdk/tests/client/signing/account.rs | 6 - sdk/tests/client/signing/mod.rs | 4 - 10 files changed, 20 insertions(+), 291 deletions(-) diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index 9e1ce84ec2..faff649d78 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, }, }; @@ -34,7 +27,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, @@ -45,7 +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, @@ -75,7 +66,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, @@ -87,7 +77,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, @@ -261,7 +250,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, @@ -300,7 +288,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, @@ -396,7 +383,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, @@ -415,7 +401,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 )); } @@ -429,7 +415,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, @@ -442,7 +427,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, @@ -461,7 +445,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 )); } @@ -483,7 +467,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, @@ -512,7 +495,6 @@ fn account_in_output_and_sender() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -523,7 +505,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( @@ -559,7 +540,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, @@ -570,7 +550,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, @@ -611,7 +590,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, @@ -642,7 +620,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, @@ -653,7 +630,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, @@ -681,7 +657,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, @@ -692,7 +667,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, @@ -733,7 +707,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, @@ -764,7 +737,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, @@ -775,7 +747,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, @@ -803,7 +774,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, @@ -814,7 +784,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, @@ -855,7 +824,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, @@ -886,7 +854,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, @@ -897,7 +864,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, @@ -926,7 +892,6 @@ fn increase_account_amount() { Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -939,7 +904,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, @@ -970,7 +934,6 @@ fn decrease_account_amount() { Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -983,7 +946,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, @@ -1026,7 +988,6 @@ fn prefer_basic_to_account() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -1070,7 +1031,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, @@ -1113,11 +1073,7 @@ fn take_amount_from_account_to_fund_basic() { 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() ); } @@ -1134,7 +1090,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, @@ -1179,7 +1134,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, @@ -1210,7 +1164,7 @@ fn account_burn_should_not_validate_account_address() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 )); } @@ -1224,7 +1178,6 @@ fn account_governance_transition_should_not_validate_account_sender() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -1269,7 +1222,6 @@ fn account_governance_transition_should_not_validate_account_address() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -1300,7 +1252,7 @@ fn account_governance_transition_should_not_validate_account_address() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 )); } @@ -1312,7 +1264,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, @@ -1353,11 +1304,7 @@ fn transitioned_zero_account_id_no_longer_is_zero() { 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() ); } @@ -1374,7 +1321,6 @@ fn two_accounts_required() { Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -1385,7 +1331,6 @@ fn two_accounts_required() { Account( 2_000_000, account_id_2, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -1447,7 +1392,6 @@ 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, @@ -1478,16 +1422,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] @@ -1498,7 +1432,6 @@ 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, @@ -1510,7 +1443,6 @@ fn state_controller_sender_required_already_selected() { Account( 1_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1552,7 +1484,6 @@ fn state_controller_sender_required_but_governance() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1564,7 +1495,6 @@ fn state_controller_sender_required_but_governance() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1608,7 +1538,6 @@ fn governor_sender_required() { Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1641,16 +1570,6 @@ 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] @@ -1662,7 +1581,6 @@ fn governor_sender_required_already_selected() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1676,7 +1594,6 @@ fn governor_sender_required_already_selected() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1718,7 +1635,6 @@ fn governance_transition_and_required() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1729,7 +1645,6 @@ fn governance_transition_and_required() { let outputs = build_outputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1760,7 +1675,6 @@ fn state_transition_and_required() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1771,7 +1685,6 @@ fn state_transition_and_required() { let outputs = build_outputs([Account( 2_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1802,7 +1715,6 @@ fn governor_sender_required_but_state() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1814,7 +1726,6 @@ fn governor_sender_required_but_state() { Account( 1_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1857,7 +1768,6 @@ fn both_state_controller_and_governor_sender() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -1910,7 +1820,6 @@ fn remainder_address_in_state_controller() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ACCOUNT_2, None, @@ -1921,7 +1830,6 @@ fn remainder_address_in_state_controller() { let outputs = build_outputs([Account( 1_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ACCOUNT_2, None, @@ -1963,7 +1871,6 @@ fn remainder_address_in_governor() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ACCOUNT_2, BECH32_ADDRESS_ED25519_0, None, @@ -1976,7 +1883,6 @@ fn remainder_address_in_governor() { let outputs = build_outputs([Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ACCOUNT_2, BECH32_ADDRESS_ED25519_0, None, @@ -2019,7 +1925,6 @@ fn do_not_change_amount_of_governance_transition() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2063,7 +1968,6 @@ fn state_transition_required_but_state_controller_not_provided() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2107,7 +2011,6 @@ fn state_transition_but_state_controller_not_owned() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2118,7 +2021,6 @@ fn state_transition_but_state_controller_not_owned() { let outputs = build_outputs([Account( 2_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2149,7 +2051,6 @@ fn governance_transition_but_governor_not_owned() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2160,7 +2061,6 @@ fn governance_transition_but_governor_not_owned() { let outputs = build_outputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2191,7 +2091,6 @@ fn burn_account_but_governor_not_owned() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2233,7 +2132,6 @@ fn sender_in_state_controller_but_not_owned() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2274,7 +2172,6 @@ fn sender_in_governor_but_not_owned() { let inputs = build_inputs([Account( 2_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_1, None, @@ -2306,98 +2203,3 @@ fn sender_in_governor_but_not_owned() { 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 - )); -} diff --git a/sdk/tests/client/input_selection/basic_outputs.rs b/sdk/tests/client/input_selection/basic_outputs.rs index 5ac987dd0a..0c5a719b63 100644 --- a/sdk/tests/client/input_selection/basic_outputs.rs +++ b/sdk/tests/client/input_selection/basic_outputs.rs @@ -553,7 +553,6 @@ fn account_sender() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -608,7 +607,6 @@ fn account_sender_zero_id() { Account( 1_000_000, account_id_0, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, diff --git a/sdk/tests/client/input_selection/burn.rs b/sdk/tests/client/input_selection/burn.rs index 03d3071ba8..3ec5c20983 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, }, }; @@ -31,7 +31,6 @@ fn burn_account_present() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -76,7 +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, @@ -196,7 +194,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 )); } @@ -210,7 +208,6 @@ fn burn_accounts_present() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -221,7 +218,6 @@ fn burn_accounts_present() { Account( 1_000_000, account_id_2, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -265,7 +261,6 @@ fn burn_account_in_outputs() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -279,7 +274,6 @@ fn burn_account_in_outputs() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -405,7 +399,6 @@ fn burn_nft_id_zero() { Account( 1_000_000, account_id_0, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -604,7 +597,6 @@ fn burn_foundry_present() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -657,11 +649,7 @@ fn burn_foundry_present() { 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 { @@ -690,7 +678,6 @@ fn burn_foundry_absent() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -749,7 +736,6 @@ fn burn_foundries_present() { Account( 1_000_000, account_id_1, - 2, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -795,11 +781,7 @@ fn burn_foundries_present() { 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() ); } @@ -902,7 +884,6 @@ fn burn_foundry_and_its_account() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -938,6 +919,6 @@ fn burn_foundry_and_its_account() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 )); } diff --git a/sdk/tests/client/input_selection/expiration.rs b/sdk/tests/client/input_selection/expiration.rs index 01c47bb738..033052054d 100644 --- a/sdk/tests/client/input_selection/expiration.rs +++ b/sdk/tests/client/input_selection/expiration.rs @@ -682,7 +682,6 @@ fn expiration_expired_only_account_addresses() { Account( 1_000_000, account_id_1, - 0, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index d52f9b1961..c13b987bbe 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -12,7 +12,7 @@ use iota_sdk::{ address::{AccountAddress, Address}, output::{ unlock_condition::{GovernorAddressUnlockCondition, StateControllerAddressUnlockCondition}, - AccountId, AccountOutputBuilder, AccountTransition, FoundryId, Output, SimpleTokenScheme, TokenId, + AccountId, AccountOutputBuilder, FoundryId, Output, SimpleTokenScheme, TokenId, }, protocol::protocol_parameters, rand::output::rand_output_metadata, @@ -58,7 +58,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 )); } @@ -117,7 +117,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, @@ -146,12 +145,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); @@ -171,7 +165,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, @@ -270,12 +263,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); @@ -292,7 +280,6 @@ fn destroy_foundry_with_account_state_transition() { Account( 50_300, account_id_2, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -310,7 +297,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 @@ -340,7 +326,6 @@ fn destroy_foundry_with_account_governance_transition() { Account( 1_000_000, account_id_2, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -369,7 +354,7 @@ fn destroy_foundry_with_account_governance_transition() { 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 )); } @@ -382,7 +367,6 @@ fn destroy_foundry_with_account_burn() { Account( 1_000_000, account_id_2, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -424,7 +408,7 @@ fn destroy_foundry_with_account_burn() { 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 )); } @@ -437,7 +421,6 @@ fn prefer_basic_to_foundry() { Account( 1_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -501,7 +484,6 @@ fn simple_foundry_transition_basic_not_needed() { .add_unlock_condition(GovernorAddressUnlockCondition::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(); @@ -543,11 +525,7 @@ fn simple_foundry_transition_basic_not_needed() { 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() ); } @@ -577,7 +555,6 @@ fn simple_foundry_transition_basic_not_needed_with_remainder() { 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 { @@ -617,11 +594,7 @@ fn simple_foundry_transition_basic_not_needed_with_remainder() { 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() { @@ -727,7 +700,6 @@ fn mint_and_burn_at_the_same_time() { 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 { @@ -784,7 +756,6 @@ fn take_amount_from_account_and_foundry_to_fund_basic() { 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 { @@ -834,7 +805,6 @@ fn create_native_token_but_burn_account() { Account( 2_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -869,7 +839,7 @@ fn create_native_token_but_burn_account() { assert!(matches!( selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id, AccountTransition::State))) if account_id == account_id_1 + Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 )); } @@ -884,7 +854,6 @@ fn melted_tokens_not_provided() { Account( 2_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -936,7 +905,6 @@ fn burned_tokens_not_provided() { Account( 2_000_000, account_id_1, - 1, BECH32_ADDRESS_ED25519_0, BECH32_ADDRESS_ED25519_0, None, @@ -998,7 +966,6 @@ fn foundry_in_outputs_and_required() { 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 { diff --git a/sdk/tests/client/input_selection/outputs.rs b/sdk/tests/client/input_selection/outputs.rs index d3003d0e19..4f3aa9a5fc 100644 --- a/sdk/tests/client/input_selection/outputs.rs +++ b/sdk/tests/client/input_selection/outputs.rs @@ -76,7 +76,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, diff --git a/sdk/tests/client/input_selection/storage_deposit_return.rs b/sdk/tests/client/input_selection/storage_deposit_return.rs index b5740f38b8..66c485bcec 100644 --- a/sdk/tests/client/input_selection/storage_deposit_return.rs +++ b/sdk/tests/client/input_selection/storage_deposit_return.rs @@ -506,7 +506,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, @@ -570,7 +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, diff --git a/sdk/tests/client/mod.rs b/sdk/tests/client/mod.rs index aebed6d716..d4dcbde1b3 100644 --- a/sdk/tests/client/mod.rs +++ b/sdk/tests/client/mod.rs @@ -86,7 +86,6 @@ enum Build<'a> { Account( u64, AccountId, - u32, &'a str, &'a str, Option>, @@ -183,7 +182,6 @@ fn build_nft_output( fn build_account_output( amount: u64, account_id: AccountId, - state_index: u32, state_address: Bech32Address, governor_address: Bech32Address, native_tokens: Option>, @@ -191,7 +189,6 @@ fn build_account_output( 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)); @@ -277,7 +274,6 @@ fn build_output_inner(build: Build) -> (Output, Option) { Build::Account( amount, account_id, - state_index, state_address, governor_address, native_tokens, @@ -288,7 +284,6 @@ fn build_output_inner(build: Build) -> (Output, Option) { build_account_output( amount, account_id, - state_index, Bech32Address::try_from_str(state_address).unwrap(), Bech32Address::try_from_str(governor_address).unwrap(), native_tokens, diff --git a/sdk/tests/client/signing/account.rs b/sdk/tests/client/signing/account.rs index 5dbc140e31..38b47c67ff 100644 --- a/sdk/tests/client/signing/account.rs +++ b/sdk/tests/client/signing/account.rs @@ -61,7 +61,6 @@ 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(), None, @@ -73,7 +72,6 @@ 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, @@ -151,7 +149,6 @@ async fn sign_account_governance_transition() -> Result<()> { let inputs = build_inputs([Account( 1_000_000, account_id, - 0, &bech32_address_0.to_string(), &bech32_address_1.to_string(), None, @@ -163,7 +160,6 @@ async fn sign_account_governance_transition() -> Result<()> { let outputs = build_outputs([Account( 1_000_000, account_id, - 0, &bech32_address_0.to_string(), &bech32_address_1.to_string(), None, @@ -244,7 +240,6 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - 0, &bech32_address_0.to_string(), &bech32_address_1.to_string(), None, @@ -278,7 +273,6 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - 1, &bech32_address_0.to_string(), &bech32_address_1.to_string(), None, diff --git a/sdk/tests/client/signing/mod.rs b/sdk/tests/client/signing/mod.rs index 95e1497fbd..9a7bf18837 100644 --- a/sdk/tests/client/signing/mod.rs +++ b/sdk/tests/client/signing/mod.rs @@ -79,7 +79,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, @@ -90,7 +89,6 @@ 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, @@ -279,7 +277,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, @@ -290,7 +287,6 @@ 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, From de48e04ede68f4e50d850d85115303f45454d4f0 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 17:48:46 +0200 Subject: [PATCH 07/56] Some more examples fixes --- .../client/output/build_account_output.rs | 5 +- .../how_tos/outputs/unlock_conditions.rs | 12 +- .../api/block_builder/input_selection/mod.rs | 1 + sdk/src/client/node_api/indexer/routes.rs | 1 + sdk/src/types/block/error.rs | 4 + sdk/src/types/block/output/account.rs | 39 +++---- .../unlock_condition/governor_address.rs | 1 + .../state_controller_address.rs | 1 + sdk/src/types/block/rand/output/mod.rs | 8 +- .../block/rand/output/unlock_condition.rs | 13 +++ .../transaction/high_level/create_account.rs | 9 +- .../client/input_selection/account_outputs.rs | 103 +++--------------- .../client/input_selection/basic_outputs.rs | 52 ++++----- sdk/tests/client/input_selection/burn.rs | 11 -- .../client/input_selection/expiration.rs | 1 - .../client/input_selection/foundry_outputs.rs | 19 +--- sdk/tests/client/input_selection/outputs.rs | 1 - .../input_selection/storage_deposit_return.rs | 22 ++-- sdk/tests/client/mod.rs | 24 +--- sdk/tests/client/signing/account.rs | 6 - sdk/tests/client/signing/mod.rs | 4 - sdk/tests/types/output/account.rs | 28 ++--- .../types/transaction_regular_essence.rs | 8 +- 23 files changed, 103 insertions(+), 270 deletions(-) diff --git a/sdk/examples/client/output/build_account_output.rs b/sdk/examples/client/output/build_account_output.rs index 656546e53c..6b808656dd 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, }, }, @@ -48,8 +48,7 @@ async fn main() -> Result<()> { .add_feature(MetadataFeature::new(metadata)?) .add_immutable_feature(IssuerFeature::new(address)) .add_immutable_feature(MetadataFeature::new(metadata)?) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(address)) - .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/outputs/unlock_conditions.rs b/sdk/examples/how_tos/outputs/unlock_conditions.rs index 9d28bff850..01692ac5b5 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)); - 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, 1)?) .finish_output(token_supply)?, - // with governor and state controller unlock condition - account_output_builder - .add_unlock_condition(GovernorAddressUnlockCondition::new(address)) - .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/mod.rs b/sdk/src/client/api/block_builder/input_selection/mod.rs index 342e01e384..6e6e125e40 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -209,6 +209,7 @@ impl InputSelection { 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. + // TODO remove ? if input.output.is_account() { return true; } diff --git a/sdk/src/client/node_api/indexer/routes.rs b/sdk/src/client/node_api/indexer/routes.rs index 7da81319aa..87edf4ec2a 100644 --- a/sdk/src/client/node_api/indexer/routes.rs +++ b/sdk/src/client/node_api/indexer/routes.rs @@ -59,6 +59,7 @@ impl ClientInner { self.get_output_ids(route, query_parameters, true, false).await } + // TODO /// 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" diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index b7cc02e0b0..5dae0f9ea4 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -153,6 +153,7 @@ pub enum Error { // TODO remove? SelfControlledAccountOutput(AccountId), SelfControlledAnchorOutput(AnchorId), + SelfDepositAccount(AccountId), SelfDepositNft(NftId), SignaturePublicKeyMismatch { expected: String, @@ -354,6 +355,9 @@ impl fmt::Display for Error { 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}",) } diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 25463a7da4..4b17baaf15 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -46,7 +46,11 @@ impl From<&OutputId> for AccountId { impl AccountId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { Self::from(output_id) } else { self } + if self.is_null() { + Self::from(output_id) + } else { + self + } } } @@ -628,24 +632,14 @@ fn verify_index_counter(account_id: &AccountId, foundry_counter: u32) -> Result< } fn verify_unlock_conditions(unlock_conditions: &UnlockConditions, account_id: &AccountId) -> Result<(), Error> { - if let Some(unlock_condition) = unlock_conditions.state_controller_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::MissingStateControllerUnlockCondition); - } - - if let Some(unlock_condition) = unlock_conditions.governor_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::MissingGovernorUnlockCondition); + return Err(Error::MissingAddressUnlockCondition); } verify_allowed_unlock_conditions(unlock_conditions, AccountOutput::ALLOWED_UNLOCK_CONDITIONS) @@ -782,12 +776,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, }, }, }, @@ -820,8 +810,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( @@ -841,8 +830,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) - .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); @@ -850,8 +838,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/unlock_condition/governor_address.rs b/sdk/src/types/block/output/unlock_condition/governor_address.rs index 6ebb6cda8c..6530d52e58 100644 --- a/sdk/src/types/block/output/unlock_condition/governor_address.rs +++ b/sdk/src/types/block/output/unlock_condition/governor_address.rs @@ -5,6 +5,7 @@ use derive_more::From; use crate::types::block::address::Address; +// TODO /// 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. #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, From, packable::Packable)] 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 88281e0ac1..127026dea3 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 @@ -5,6 +5,7 @@ use derive_more::From; use crate::types::block::address::Address; +// TODO /// 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. #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, From, packable::Packable)] diff --git a/sdk/src/types/block/rand/output/mod.rs b/sdk/src/types/block/rand/output/mod.rs index ab524f0e7c..8bef6af9be 100644 --- a/sdk/src/types/block/rand/output/mod.rs +++ b/sdk/src/types/block/rand/output/mod.rs @@ -24,8 +24,7 @@ use crate::types::block::{ feature::rand_allowed_features, unlock_condition::{ rand_address_unlock_condition, rand_address_unlock_condition_different_from, - rand_governor_address_unlock_condition_different_from, - rand_state_controller_address_unlock_condition_different_from, + rand_address_unlock_condition_different_from_account_id, }, }, transaction::rand_transaction_id, @@ -59,10 +58,7 @@ 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_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)) .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..9a0c91cf08 100644 --- a/sdk/src/types/block/rand/output/unlock_condition.rs +++ b/sdk/src/types/block/rand/output/unlock_condition.rs @@ -45,6 +45,19 @@ pub fn rand_governor_address_unlock_condition_different_from(account_id: &Accoun address.into() } +/// 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 { + while account_address.account_id() == account_id { + account_address = rand_account_address(); + } + } + + address.into() +} + /// Generates a random [`AddressUnlockCondition`] that is different from `nft_id`. pub fn rand_address_unlock_condition_different_from(nft_id: &NftId) -> AddressUnlockCondition { let mut address = rand_address(); 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 718bc7b53b..1220a3adbb 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, @@ -74,7 +72,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() @@ -92,8 +90,7 @@ where let mut account_output_builder = AccountOutputBuilder::new_with_minimum_storage_deposit(rent_structure, AccountId::null()) .with_foundry_counter(0) - .add_unlock_condition(StateControllerAddressUnlockCondition::new(controller_address)) - .add_unlock_condition(GovernorAddressUnlockCondition::new(controller_address)); + .add_unlock_condition(AddressUnlockCondition::new(address)); if let Some(CreateAccountParams { immutable_metadata, metadata, diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index faff649d78..b2f5f94683 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -28,7 +28,6 @@ fn input_account_eq_output_account() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -38,7 +37,6 @@ fn input_account_eq_output_account() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -67,7 +65,6 @@ fn transition_account_id_zero() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -78,7 +75,6 @@ fn transition_account_id_zero() { 1_000_000, account_id, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -251,7 +247,6 @@ fn create_account() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -289,7 +284,6 @@ fn burn_account() { 2_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -384,7 +378,6 @@ fn missing_input_for_account_output() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -416,7 +409,6 @@ fn missing_input_for_account_output_2() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -428,7 +420,6 @@ fn missing_input_for_account_output_2() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -468,7 +459,6 @@ fn missing_input_for_account_output_but_created() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -496,7 +486,6 @@ fn account_in_output_and_sender() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -541,7 +530,6 @@ fn missing_ed25519_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -551,7 +539,6 @@ fn missing_ed25519_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_ED25519_1), None, @@ -591,7 +578,6 @@ fn missing_ed25519_issuer_created() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ED25519_1), @@ -621,7 +607,6 @@ fn missing_ed25519_issuer_transition() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ED25519_1), @@ -631,7 +616,6 @@ fn missing_ed25519_issuer_transition() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ED25519_1), @@ -658,7 +642,6 @@ fn missing_account_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -668,7 +651,6 @@ fn missing_account_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_ACCOUNT_1), None, @@ -708,7 +690,6 @@ fn missing_account_issuer_created() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ACCOUNT_1), @@ -738,7 +719,6 @@ fn missing_account_issuer_transition() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ACCOUNT_1), @@ -748,7 +728,6 @@ fn missing_account_issuer_transition() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_ACCOUNT_1), @@ -775,7 +754,6 @@ fn missing_nft_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -785,7 +763,6 @@ fn missing_nft_sender() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, Some(BECH32_ADDRESS_NFT_1), None, @@ -825,7 +802,6 @@ fn missing_nft_issuer_created() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_NFT_1), @@ -855,7 +831,6 @@ fn missing_nft_issuer_transition() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_NFT_1), @@ -865,7 +840,6 @@ fn missing_nft_issuer_transition() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, Some(BECH32_ADDRESS_NFT_1), @@ -893,7 +867,6 @@ fn increase_account_amount() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -905,7 +878,6 @@ fn increase_account_amount() { 3_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -935,7 +907,6 @@ fn decrease_account_amount() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -947,7 +918,6 @@ fn decrease_account_amount() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -989,7 +959,6 @@ fn prefer_basic_to_account() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1032,7 +1001,6 @@ fn take_amount_from_account_to_fund_basic() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1091,7 +1059,6 @@ fn account_burn_should_not_validate_account_sender() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1135,7 +1102,6 @@ fn account_burn_should_not_validate_account_address() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1179,7 +1145,6 @@ fn account_governance_transition_should_not_validate_account_sender() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1223,7 +1188,6 @@ fn account_governance_transition_should_not_validate_account_address() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1265,7 +1229,6 @@ fn transitioned_zero_account_id_no_longer_is_zero() { 2_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1322,7 +1285,6 @@ fn two_accounts_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1332,7 +1294,6 @@ fn two_accounts_required() { 2_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1362,26 +1323,22 @@ fn two_accounts_required() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 3); assert!(selected.outputs.contains(&outputs[0])); - assert!( - selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.account_id() == &account_id_1 - } else { - false - }) - ); - assert!( - selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.account_id() == &account_id_2 - } else { - false - }) - ) + assert!(selected + .outputs + .iter() + .any(|output| if let Output::Account(output) = output { + output.account_id() == &account_id_1 + } else { + false + })); + assert!(selected + .outputs + .iter() + .any(|output| if let Output::Account(output) = output { + output.account_id() == &account_id_2 + } else { + false + })) } #[test] @@ -1393,7 +1350,6 @@ fn state_controller_sender_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1433,7 +1389,6 @@ fn state_controller_sender_required_already_selected() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1444,7 +1399,6 @@ fn state_controller_sender_required_already_selected() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1485,7 +1439,6 @@ fn state_controller_sender_required_but_governance() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1496,7 +1449,6 @@ fn state_controller_sender_required_but_governance() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1539,7 +1491,6 @@ fn governor_sender_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1582,7 +1533,6 @@ fn governor_sender_required_already_selected() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1595,7 +1545,6 @@ fn governor_sender_required_already_selected() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1636,7 +1585,6 @@ fn governance_transition_and_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1646,7 +1594,6 @@ fn governance_transition_and_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1676,7 +1623,6 @@ fn state_transition_and_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1686,7 +1632,6 @@ fn state_transition_and_required() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1716,7 +1661,6 @@ fn governor_sender_required_but_state() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1727,7 +1671,6 @@ fn governor_sender_required_but_state() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1769,7 +1712,6 @@ fn both_state_controller_and_governor_sender() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1821,7 +1763,6 @@ fn remainder_address_in_state_controller() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ACCOUNT_2, None, None, None, @@ -1831,7 +1772,6 @@ fn remainder_address_in_state_controller() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ACCOUNT_2, None, None, None, @@ -1872,7 +1812,6 @@ fn remainder_address_in_governor() { 1_000_000, account_id_1, BECH32_ADDRESS_ACCOUNT_2, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1884,7 +1823,6 @@ fn remainder_address_in_governor() { 1_000_000, account_id_1, BECH32_ADDRESS_ACCOUNT_2, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -1926,7 +1864,6 @@ fn do_not_change_amount_of_governance_transition() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -1969,7 +1906,6 @@ fn state_transition_required_but_state_controller_not_provided() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2012,7 +1948,6 @@ fn state_transition_but_state_controller_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2022,7 +1957,6 @@ fn state_transition_but_state_controller_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2052,7 +1986,6 @@ fn governance_transition_but_governor_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2062,7 +1995,6 @@ fn governance_transition_but_governor_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2092,7 +2024,6 @@ fn burn_account_but_governor_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2133,7 +2064,6 @@ fn sender_in_state_controller_but_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, @@ -2173,7 +2103,6 @@ fn sender_in_governor_but_not_owned() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_1, None, None, None, diff --git a/sdk/tests/client/input_selection/basic_outputs.rs b/sdk/tests/client/input_selection/basic_outputs.rs index 0c5a719b63..52094bd919 100644 --- a/sdk/tests/client/input_selection/basic_outputs.rs +++ b/sdk/tests/client/input_selection/basic_outputs.rs @@ -493,12 +493,10 @@ fn ed25519_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!( - selected - .inputs - .iter() - .any(|input| *input.output.as_basic().address() == sender) - ); + assert!(selected + .inputs + .iter() + .any(|input| *input.output.as_basic().address() == sender)); // Provided output + remainder assert_eq!(selected.outputs.len(), 2); } @@ -554,7 +552,6 @@ fn account_sender() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -586,12 +583,10 @@ fn account_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!( - selected - .inputs - .iter() - .any(|input| input.output.is_account() && *input.output.as_account().account_id() == account_id_1) - ); + assert!(selected + .inputs + .iter() + .any(|input| input.output.is_account() && *input.output.as_account().account_id() == account_id_1)); // Provided output + account assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&outputs[0])); @@ -608,7 +603,6 @@ fn account_sender_zero_id() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -642,12 +636,10 @@ fn account_sender_zero_id() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); - assert!( - selected - .outputs - .iter() - .any(|output| output.is_account() && *output.as_account().account_id() == account_id) - ); + assert!(selected + .outputs + .iter() + .any(|output| output.is_account() && *output.as_account().account_id() == account_id)); } #[test] @@ -733,12 +725,10 @@ fn nft_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!( - selected - .inputs - .iter() - .any(|input| input.output.is_nft() && *input.output.as_nft().nft_id() == nft_id_1) - ); + assert!(selected + .inputs + .iter() + .any(|input| input.output.is_nft() && *input.output.as_nft().nft_id() == nft_id_1)); // Provided output + nft assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&inputs[2].output)); @@ -791,12 +781,10 @@ fn nft_sender_zero_id() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); - assert!( - selected - .outputs - .iter() - .any(|output| output.is_nft() && *output.as_nft().nft_id() == nft_id) - ); + assert!(selected + .outputs + .iter() + .any(|output| output.is_nft() && *output.as_nft().nft_id() == nft_id)); } #[test] diff --git a/sdk/tests/client/input_selection/burn.rs b/sdk/tests/client/input_selection/burn.rs index 3ec5c20983..843ec6f69f 100644 --- a/sdk/tests/client/input_selection/burn.rs +++ b/sdk/tests/client/input_selection/burn.rs @@ -32,7 +32,6 @@ fn burn_account_present() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -76,7 +75,6 @@ fn burn_account_present_and_required() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -209,7 +207,6 @@ fn burn_accounts_present() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -219,7 +216,6 @@ fn burn_accounts_present() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -262,7 +258,6 @@ fn burn_account_in_outputs() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -275,7 +270,6 @@ fn burn_account_in_outputs() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -400,7 +394,6 @@ fn burn_nft_id_zero() { 1_000_000, account_id_0, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -598,7 +591,6 @@ fn burn_foundry_present() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -679,7 +671,6 @@ fn burn_foundry_absent() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -737,7 +728,6 @@ fn burn_foundries_present() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -885,7 +875,6 @@ fn burn_foundry_and_its_account() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, diff --git a/sdk/tests/client/input_selection/expiration.rs b/sdk/tests/client/input_selection/expiration.rs index 033052054d..8323cbbea7 100644 --- a/sdk/tests/client/input_selection/expiration.rs +++ b/sdk/tests/client/input_selection/expiration.rs @@ -683,7 +683,6 @@ fn expiration_expired_only_account_addresses() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index c13b987bbe..82a4bff646 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -118,7 +118,6 @@ fn minted_native_tokens_in_new_remainder() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -166,7 +165,6 @@ fn minted_native_tokens_in_provided_output() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -277,16 +275,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, - 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, @@ -327,7 +316,6 @@ fn destroy_foundry_with_account_governance_transition() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -368,7 +356,6 @@ fn destroy_foundry_with_account_burn() { 1_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -422,7 +409,6 @@ fn prefer_basic_to_foundry() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -806,7 +792,6 @@ fn create_native_token_but_burn_account() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -855,7 +840,6 @@ fn melted_tokens_not_provided() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -906,7 +890,6 @@ fn burned_tokens_not_provided() { 2_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, diff --git a/sdk/tests/client/input_selection/outputs.rs b/sdk/tests/client/input_selection/outputs.rs index 4f3aa9a5fc..c8d588e0ef 100644 --- a/sdk/tests/client/input_selection/outputs.rs +++ b/sdk/tests/client/input_selection/outputs.rs @@ -77,7 +77,6 @@ fn no_outputs_but_burn() { 2_000_000, account_id_2, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, 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 66c485bcec..47067ee709 100644 --- a/sdk/tests/client/input_selection/storage_deposit_return.rs +++ b/sdk/tests/client/input_selection/storage_deposit_return.rs @@ -317,18 +317,14 @@ fn two_sdrucs_to_different_addresses_both_needed() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 3); assert!(selected.outputs.contains(&outputs[0])); - assert!( - selected - .outputs - .iter() - .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_1, None) }) - ); - assert!( - selected - .outputs - .iter() - .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_2, None) }) - ); + assert!(selected + .outputs + .iter() + .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_1, None) })); + assert!(selected + .outputs + .iter() + .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_2, None) })); } #[test] @@ -507,7 +503,6 @@ fn sdruc_required_non_ed25519_in_address_unlock() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, @@ -570,7 +565,6 @@ fn useless_sdruc_non_ed25519_in_address_unlock() { 1_000_000, account_id_1, BECH32_ADDRESS_ED25519_0, - BECH32_ADDRESS_ED25519_0, None, None, None, diff --git a/sdk/tests/client/mod.rs b/sdk/tests/client/mod.rs index d4dcbde1b3..ef803f9128 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, @@ -87,7 +86,6 @@ enum Build<'a> { u64, AccountId, &'a str, - &'a str, Option>, Option<&'a str>, Option<&'a str>, @@ -182,15 +180,13 @@ fn build_nft_output( fn build_account_output( amount: u64, account_id: AccountId, - 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) - .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( @@ -271,21 +267,11 @@ fn build_output_inner(build: Build) -> (Output, Option) { ), chain, ), - Build::Account( - amount, - account_id, - 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, - 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/signing/account.rs b/sdk/tests/client/signing/account.rs index 38b47c67ff..22840ef566 100644 --- a/sdk/tests/client/signing/account.rs +++ b/sdk/tests/client/signing/account.rs @@ -62,7 +62,6 @@ async fn sign_account_state_transition() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, @@ -73,7 +72,6 @@ async fn sign_account_state_transition() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, @@ -150,7 +148,6 @@ async fn sign_account_governance_transition() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, @@ -161,7 +158,6 @@ async fn sign_account_governance_transition() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, @@ -241,7 +237,6 @@ async fn account_reference_unlocks() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, @@ -274,7 +269,6 @@ async fn account_reference_unlocks() -> Result<()> { 1_000_000, account_id, &bech32_address_0.to_string(), - &bech32_address_1.to_string(), None, None, None, diff --git a/sdk/tests/client/signing/mod.rs b/sdk/tests/client/signing/mod.rs index 9a7bf18837..0a82b7adff 100644 --- a/sdk/tests/client/signing/mod.rs +++ b/sdk/tests/client/signing/mod.rs @@ -80,7 +80,6 @@ async fn all_combined() -> Result<()> { 1_000_000, account_id_1, &nft_1_bech32_address.to_string(), - &nft_1_bech32_address.to_string(), None, None, None, @@ -90,7 +89,6 @@ async fn all_combined() -> Result<()> { 1_000_000, account_id_2, &ed25519_bech32_address_0.to_string(), - &ed25519_bech32_address_1.to_string(), None, None, None, @@ -278,7 +276,6 @@ async fn all_combined() -> Result<()> { 1_000_000, account_id_1, &nft_1_bech32_address.to_string(), - &nft_1_bech32_address.to_string(), None, None, None, @@ -288,7 +285,6 @@ async fn all_combined() -> Result<()> { 1_000_000, account_id_2, &ed25519_bech32_address_0.to_string(), - &ed25519_bech32_address_1.to_string(), None, None, None, diff --git a/sdk/tests/types/output/account.rs b/sdk/tests/types/output/account.rs index d62f730398..8827287892 100644 --- a/sdk/tests/types/output/account.rs +++ b/sdk/tests/types/output/account.rs @@ -10,7 +10,7 @@ use iota_sdk::types::{ 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_address_unlock_condition_different_from_account_id, rand_state_controller_address_unlock_condition_different_from, }, }, @@ -24,10 +24,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(); @@ -36,8 +34,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) - .add_unlock_condition(state_address_1) + .add_unlock_condition(address_1) .add_feature(sender_1) .replace_feature(sender_2) .replace_immutable_feature(issuer_1) @@ -45,11 +42,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)); @@ -57,14 +50,9 @@ fn builder() { .clear_unlock_conditions() .clear_features() .clear_immutable_features() - .replace_unlock_condition(gov_address_2) - .replace_unlock_condition(state_address_2); + .replace_unlock_condition(address_2); 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()); @@ -75,7 +63,7 @@ fn builder() { .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.into()]) .with_immutable_features([Feature::from(metadata.clone()), issuer_1.into()]) .finish_with_params(ValidationParams::default().with_protocol_parameters(protocol_parameters.clone())) diff --git a/sdk/tests/types/transaction_regular_essence.rs b/sdk/tests/types/transaction_regular_essence.rs index d7a9f192c5..290b2ff301 100644 --- a/sdk/tests/types/transaction_regular_essence.rs +++ b/sdk/tests/types/transaction_regular_essence.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, }, @@ -411,8 +408,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)) - .add_unlock_condition(GovernorAddressUnlockCondition::new(address)) + .add_unlock_condition(AddressUnlockCondition::new(address)) .finish_output(protocol_parameters.token_supply()) .unwrap(); From f3607b47491277899f5d21ede16f0b5b30bda53b Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 17:56:55 +0200 Subject: [PATCH 08/56] More test fixes --- .../input_selection/requirement/ed25519.rs | 28 +++------------ .../addresses/output_ids/account_foundry.rs | 1 + .../client/input_selection/foundry_outputs.rs | 34 +++++-------------- sdk/tests/types/output/account.rs | 8 +---- sdk/tests/wallet/syncing.rs | 10 ++---- 5 files changed, 17 insertions(+), 64 deletions(-) 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 d42dbf228d..f537aad9e2 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 @@ -20,30 +20,12 @@ impl InputSelection { // 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 { - // TODO remove? - 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); - } - - // PANIC: safe to unwrap as accounts have a governor address. - if unlock_conditions.governor_address().unwrap().address() == address { - return self.addresses.contains(address); - } - - false - } else { - let (required_address, _) = input - .output - .required_and_unlocked_address(self.slot_index, input.output_id()) - .unwrap(); + let (required_address, _) = input + .output + .required_and_unlocked_address(self.slot_index, input.output_id()) + .unwrap(); - &required_address == address - } + &required_address == address } /// Fulfills an ed25519 sender requirement by selecting an available input that unlocks its address. diff --git a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs index 3b541fd44b..d91f9ee146 100644 --- a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs +++ b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs @@ -26,6 +26,7 @@ impl Account where crate::wallet::Error: From, { + // TODO /// Returns output ids of account outputs pub(crate) async fn get_account_and_foundry_output_ids( &self, diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index 82a4bff646..a8f0587e8e 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, FoundryId, Output, SimpleTokenScheme, TokenId, + unlock_condition::AddressUnlockCondition, AccountId, AccountOutputBuilder, FoundryId, Output, + SimpleTokenScheme, TokenId, }, protocol::protocol_parameters, rand::output::rand_output_metadata, @@ -226,10 +226,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) @@ -464,10 +461,7 @@ 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_foundry_counter(1) @@ -534,10 +528,7 @@ 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) @@ -679,10 +670,7 @@ 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) @@ -735,10 +723,7 @@ 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) @@ -942,10 +927,7 @@ 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) diff --git a/sdk/tests/types/output/account.rs b/sdk/tests/types/output/account.rs index 8827287892..bc37802207 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_address_unlock_condition_different_from_account_id, - rand_state_controller_address_unlock_condition_different_from, - }, + unlock_condition::rand_address_unlock_condition_different_from_account_id, }, }, ValidationParams, @@ -60,9 +57,6 @@ 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_address_unlock_condition_different_from_account_id(&account_id)) .with_features([Feature::from(metadata.clone()), sender_1.into()]) .with_immutable_features([Feature::from(metadata.clone()), issuer_1.into()]) diff --git a/sdk/tests/wallet/syncing.rs b/sdk/tests/wallet/syncing.rs index 529e5479f8..7afab439d3 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}, @@ -107,10 +104,7 @@ 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)), - UnlockCondition::GovernorAddress(GovernorAddressUnlockCondition::new(account_1_address)), - ]) + .with_unlock_conditions([UnlockCondition::Address(AddressUnlockCondition::new(account_1_address))]) .finish_output(token_supply)?, ]; From 7265a92661235ea76097b21e3c83e112fb0479fa Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 17:58:41 +0200 Subject: [PATCH 09/56] Warnings --- sdk/src/types/block/output/account.rs | 6 +-- .../client/input_selection/account_outputs.rs | 36 +++++++------ .../client/input_selection/basic_outputs.rs | 50 +++++++++++-------- .../input_selection/storage_deposit_return.rs | 20 +++++--- sdk/tests/client/signing/account.rs | 42 ++++------------ 5 files changed, 72 insertions(+), 82 deletions(-) diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 4b17baaf15..46002aeec5 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -46,11 +46,7 @@ impl From<&OutputId> for AccountId { impl AccountId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { - Self::from(output_id) - } else { - self - } + if self.is_null() { Self::from(output_id) } else { self } } } diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index b2f5f94683..548a1c92bf 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -1323,22 +1323,26 @@ fn two_accounts_required() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 3); assert!(selected.outputs.contains(&outputs[0])); - assert!(selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.account_id() == &account_id_1 - } else { - false - })); - assert!(selected - .outputs - .iter() - .any(|output| if let Output::Account(output) = output { - output.account_id() == &account_id_2 - } else { - false - })) + assert!( + selected + .outputs + .iter() + .any(|output| if let Output::Account(output) = output { + output.account_id() == &account_id_1 + } else { + false + }) + ); + assert!( + selected + .outputs + .iter() + .any(|output| if let Output::Account(output) = output { + output.account_id() == &account_id_2 + } else { + false + }) + ) } #[test] diff --git a/sdk/tests/client/input_selection/basic_outputs.rs b/sdk/tests/client/input_selection/basic_outputs.rs index 52094bd919..47b757a45f 100644 --- a/sdk/tests/client/input_selection/basic_outputs.rs +++ b/sdk/tests/client/input_selection/basic_outputs.rs @@ -493,10 +493,12 @@ fn ed25519_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!(selected - .inputs - .iter() - .any(|input| *input.output.as_basic().address() == sender)); + assert!( + selected + .inputs + .iter() + .any(|input| *input.output.as_basic().address() == sender) + ); // Provided output + remainder assert_eq!(selected.outputs.len(), 2); } @@ -583,10 +585,12 @@ fn account_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!(selected - .inputs - .iter() - .any(|input| input.output.is_account() && *input.output.as_account().account_id() == account_id_1)); + assert!( + selected + .inputs + .iter() + .any(|input| input.output.is_account() && *input.output.as_account().account_id() == account_id_1) + ); // Provided output + account assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&outputs[0])); @@ -636,10 +640,12 @@ fn account_sender_zero_id() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); - assert!(selected - .outputs - .iter() - .any(|output| output.is_account() && *output.as_account().account_id() == account_id)); + assert!( + selected + .outputs + .iter() + .any(|output| output.is_account() && *output.as_account().account_id() == account_id) + ); } #[test] @@ -725,10 +731,12 @@ fn nft_sender() { // Sender + another for amount assert_eq!(selected.inputs.len(), 2); - assert!(selected - .inputs - .iter() - .any(|input| input.output.is_nft() && *input.output.as_nft().nft_id() == nft_id_1)); + assert!( + selected + .inputs + .iter() + .any(|input| input.output.is_nft() && *input.output.as_nft().nft_id() == nft_id_1) + ); // Provided output + nft assert_eq!(selected.outputs.len(), 2); assert!(selected.outputs.contains(&inputs[2].output)); @@ -781,10 +789,12 @@ fn nft_sender_zero_id() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 2); - assert!(selected - .outputs - .iter() - .any(|output| output.is_nft() && *output.as_nft().nft_id() == nft_id)); + assert!( + selected + .outputs + .iter() + .any(|output| output.is_nft() && *output.as_nft().nft_id() == nft_id) + ); } #[test] diff --git a/sdk/tests/client/input_selection/storage_deposit_return.rs b/sdk/tests/client/input_selection/storage_deposit_return.rs index 47067ee709..bc90f7e61c 100644 --- a/sdk/tests/client/input_selection/storage_deposit_return.rs +++ b/sdk/tests/client/input_selection/storage_deposit_return.rs @@ -317,14 +317,18 @@ fn two_sdrucs_to_different_addresses_both_needed() { assert!(unsorted_eq(&selected.inputs, &inputs)); assert_eq!(selected.outputs.len(), 3); assert!(selected.outputs.contains(&outputs[0])); - assert!(selected - .outputs - .iter() - .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_1, None) })); - assert!(selected - .outputs - .iter() - .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_2, None) })); + assert!( + selected + .outputs + .iter() + .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_1, None) }) + ); + assert!( + selected + .outputs + .iter() + .any(|output| { is_remainder_or_return(output, 1_000_000, BECH32_ADDRESS_ED25519_2, None) }) + ); } #[test] diff --git a/sdk/tests/client/signing/account.rs b/sdk/tests/client/signing/account.rs index 22840ef566..90fccd41c3 100644 --- a/sdk/tests/client/signing/account.rs +++ b/sdk/tests/client/signing/account.rs @@ -38,7 +38,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) @@ -46,14 +46,6 @@ async fn sign_account_state_transition() -> Result<()> { ) .await?[0] .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] - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); let protocol_parameters = protocol_parameters(); let account_id = AccountId::from_str(ACCOUNT_ID_1)?; @@ -61,7 +53,7 @@ async fn sign_account_state_transition() -> Result<()> { let inputs = build_inputs([Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, @@ -71,7 +63,7 @@ async fn sign_account_state_transition() -> Result<()> { let outputs = build_outputs([Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, @@ -124,7 +116,7 @@ async fn sign_account_state_transition() -> Result<()> { async fn sign_account_governance_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) @@ -132,14 +124,6 @@ async fn sign_account_governance_transition() -> Result<()> { ) .await?[0] .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] - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); let protocol_parameters = protocol_parameters(); let account_id = AccountId::from_str(ACCOUNT_ID_1)?; @@ -147,7 +131,7 @@ async fn sign_account_governance_transition() -> Result<()> { let inputs = build_inputs([Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, @@ -157,7 +141,7 @@ async fn sign_account_governance_transition() -> Result<()> { let outputs = build_outputs([Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, @@ -210,7 +194,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) @@ -218,14 +202,6 @@ async fn account_reference_unlocks() -> Result<()> { ) .await?[0] .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] - .to_bech32(SHIMMER_TESTNET_BECH32_HRP); let protocol_parameters = protocol_parameters(); let account_id = AccountId::from_str(ACCOUNT_ID_1)?; @@ -236,7 +212,7 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, @@ -268,7 +244,7 @@ async fn account_reference_unlocks() -> Result<()> { Account( 1_000_000, account_id, - &bech32_address_0.to_string(), + &bech32_address.to_string(), None, None, None, From 05fd9c73c104b435a67c8c51ebf7c6aa329788f1 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 3 Oct 2023 19:52:25 +0200 Subject: [PATCH 10/56] Fix some tests --- .../client/input_selection/account_outputs.rs | 712 +++--------------- sdk/tests/client/input_selection/burn.rs | 4 +- .../client/input_selection/foundry_outputs.rs | 68 +- sdk/tests/client/signing/account.rs | 78 -- 4 files changed, 105 insertions(+), 757 deletions(-) diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index 548a1c92bf..dc3a0a2f25 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -15,8 +15,8 @@ use iota_sdk::{ 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_ED25519_2, BECH32_ADDRESS_NFT_1, TOKEN_SUPPLY, }; #[test] @@ -1037,7 +1037,7 @@ 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!( @@ -1134,92 +1134,6 @@ fn account_burn_should_not_validate_account_address() { )); } -#[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, - 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, - 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(); - - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) if account_id == account_id_1 - )); -} - #[test] fn transitioned_zero_account_id_no_longer_is_zero() { let protocol_parameters = protocol_parameters(); @@ -1435,7 +1349,7 @@ 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(); @@ -1448,65 +1362,48 @@ fn state_controller_sender_required_but_governance() { None, None, )]); - let outputs = build_outputs([ - Account( - 1_000_000, - account_id_1, - BECH32_ADDRESS_ED25519_0, - 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, - 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([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, @@ -1516,7 +1413,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() @@ -1525,63 +1422,62 @@ fn governor_sender_required() { 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 governor_sender_required_already_selected() { +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( - 1_000_000, - account_id_1, - BECH32_ADDRESS_ED25519_0, - 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, - 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 inputs = build_inputs([Account( + 2_000_000, + account_id_1, + BECH32_ADDRESS_ED25519_0, + 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.clone(), - outputs.clone(), + inputs, + outputs, addresses([BECH32_ADDRESS_ED25519_1]), protocol_parameters, ) - .with_required_inputs([*inputs[0].output_id()]) - .select() - .unwrap(); + .select(); - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); + assert!(matches!( + selected, + Err(Error::InsufficientAmount { + found: 0, + required: 1_000_000, + }) + )); } #[test] -fn governance_transition_and_required() { +fn state_transition_but_state_controller_not_owned() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); @@ -1605,21 +1501,21 @@ fn governance_transition_and_required() { )]); let selected = InputSelection::new( - inputs.clone(), - outputs.clone(), + inputs, + outputs, addresses([BECH32_ADDRESS_ED25519_1]), protocol_parameters, ) - .with_required_inputs([*inputs[0].output_id()]) - .select() - .unwrap(); + .select(); - assert!(unsorted_eq(&selected.inputs, &inputs)); - assert!(unsorted_eq(&selected.outputs, &outputs)); + assert!(matches!( + selected, + Err(Error::UnfulfillableRequirement(Requirement::Ed25519(address))) if address == Address::try_from_bech32(BECH32_ADDRESS_ED25519_0).unwrap() + )); } #[test] -fn state_transition_and_required() { +fn burn_account_but_governor_not_owned() { let protocol_parameters = protocol_parameters(); let account_id_1 = AccountId::from_str(ACCOUNT_ID_1).unwrap(); @@ -1632,416 +1528,15 @@ fn state_transition_and_required() { None, None, )]); - let outputs = build_outputs([Account( - 2_000_000, - account_id_1, + let outputs = build_outputs([Basic( + 1_000_000, BECH32_ADDRESS_ED25519_0, 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, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - )]); - let outputs = build_outputs([ - Account( - 1_000_000, - account_id_1, - 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.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, - BECH32_ADDRESS_ED25519_0, - 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, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Account( - 1_000_000, - account_id_1, - BECH32_ADDRESS_ED25519_0, - 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, - BECH32_ADDRESS_ACCOUNT_2, - 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, - BECH32_ADDRESS_ACCOUNT_2, - 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, - BECH32_ADDRESS_ED25519_0, - 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, - BECH32_ADDRESS_ED25519_0, - 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, - 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, - 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, - 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, - 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, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - )]); - let outputs = build_outputs([Basic( - 1_000_000, - BECH32_ADDRESS_ED25519_0, - None, - None, - None, - None, - None, - None, + None, + None, )]); let selected = InputSelection::new( @@ -2097,42 +1592,3 @@ fn sender_in_state_controller_but_not_owned() { 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, - BECH32_ADDRESS_ED25519_0, - 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() - )); -} diff --git a/sdk/tests/client/input_selection/burn.rs b/sdk/tests/client/input_selection/burn.rs index 843ec6f69f..fa428721a2 100644 --- a/sdk/tests/client/input_selection/burn.rs +++ b/sdk/tests/client/input_selection/burn.rs @@ -637,7 +637,7 @@ 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!( @@ -767,7 +767,7 @@ 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!( diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index a8f0587e8e..c24614ee42 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -303,46 +303,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, - 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))) if account_id == account_id_2 - )); -} - #[test] fn destroy_foundry_with_account_burn() { let protocol_parameters = protocol_parameters(); @@ -379,7 +339,7 @@ fn destroy_foundry_with_account_burn() { let selected = InputSelection::new( inputs.clone(), - outputs, + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) @@ -388,12 +348,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))) 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] @@ -501,7 +471,7 @@ 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!( @@ -567,7 +537,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!( @@ -628,7 +598,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!( diff --git a/sdk/tests/client/signing/account.rs b/sdk/tests/client/signing/account.rs index 90fccd41c3..427f86e7cb 100644 --- a/sdk/tests/client/signing/account.rs +++ b/sdk/tests/client/signing/account.rs @@ -112,84 +112,6 @@ async fn sign_account_state_transition() -> Result<()> { Ok(()) } -#[tokio::test] -async fn sign_account_governance_transition() -> Result<()> { - let secret_manager = SecretManager::try_from_mnemonic(Client::generate_mnemonic()?)?; - - let bech32_address = &secret_manager - .generate_ed25519_addresses( - GetAddressesOptions::default() - .with_coin_type(SHIMMER_COIN_TYPE) - .with_range(0..1), - ) - .await?[0] - .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, - &bech32_address.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, - &bech32_address.to_string(), - None, - None, - None, - None, - )]); - - let essence = TransactionEssence::Regular( - RegularTransactionEssence::builder( - protocol_parameters.network_id(), - InputsCommitment::new(inputs.iter().map(|i| &i.output)), - ) - .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 { - essence, - inputs_data: inputs, - remainder: None, - }; - - let unlocks = secret_manager - .sign_transaction_essence(&prepared_transaction_data) - .await?; - - assert_eq!(unlocks.len(), 1); - assert_eq!((*unlocks).get(0).unwrap().kind(), SignatureUnlock::KIND); - - let tx_payload = TransactionPayload::new(prepared_transaction_data.essence.as_regular().clone(), unlocks)?; - - validate_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 account_reference_unlocks() -> Result<()> { let secret_manager = SecretManager::try_from_mnemonic(Client::generate_mnemonic()?)?; From 503b23f66cdce79011a25b810fbf01d556edb195 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 4 Oct 2023 10:03:50 +0200 Subject: [PATCH 11/56] Some bindings changes --- .../client/13-build-account-output.ts | 1 - .../account_output/governance-transition.ts | 109 ------------------ .../account_output/state-transition.ts | 88 -------------- .../nodejs/lib/types/block/output/output.ts | 29 +---- .../account-output-params.ts | 8 -- .../lib/types/wallet/transaction-options.ts | 2 - .../account_output/governance_transition.py | 75 ------------ .../account_output/state_transition.py | 59 ---------- bindings/python/iota_sdk/client/client.py | 2 - bindings/python/tests/test_block.py | 2 +- bindings/python/tests/test_output.py | 4 - 11 files changed, 2 insertions(+), 377 deletions(-) delete mode 100644 bindings/nodejs/examples/how_tos/account_output/governance-transition.ts delete mode 100644 bindings/nodejs/examples/how_tos/account_output/state-transition.ts delete mode 100644 bindings/python/examples/how_tos/account_output/governance_transition.py delete mode 100644 bindings/python/examples/how_tos/account_output/state_transition.py diff --git a/bindings/nodejs/examples/client/13-build-account-output.ts b/bindings/nodejs/examples/client/13-build-account-output.ts index a5e021efc0..326f3a565f 100644 --- a/bindings/nodejs/examples/client/13-build-account-output.ts +++ b/bindings/nodejs/examples/client/13-build-account-output.ts @@ -38,7 +38,6 @@ async function run() { const accountOutput = await client.buildAccountOutput({ accountId: '0x0000000000000000000000000000000000000000000000000000000000000000', - stateMetadata: utf8ToHex('hello'), unlockConditions: [ new StateControllerAddressUnlockCondition( 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 479da9ea9f..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(); - if (!process.env.FAUCET_URL) { - throw new Error('.env FAUCET_URL is undefined, see .env.example'); - } - if (!process.env.WALLET_DB_PATH) { - throw new Error('.env WALLET_DB_PATH is undefined, see .env.example'); - } - if (!process.env.STRONGHOLD_PASSWORD) { - throw new Error( - '.env STRONGHOLD_PASSWORD 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); - - 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 b5f1150d52..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(); - if (!process.env.FAUCET_URL) { - throw new Error('.env FAUCET_URL is undefined, see .env.example'); - } - if (!process.env.WALLET_DB_PATH) { - throw new Error('.env WALLET_DB_PATH is undefined, see .env.example'); - } - if (!process.env.STRONGHOLD_PASSWORD) { - throw new Error( - '.env STRONGHOLD_PASSWORD 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); - - 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/lib/types/block/output/output.ts b/bindings/nodejs/lib/types/block/output/output.ts index 9fbf608c7e..9069fff3a1 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 b0eafa398b..864c31f427 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 @@ -11,14 +11,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: HexEncodedString; - /** - * 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/wallet/transaction-options.ts b/bindings/nodejs/lib/types/wallet/transaction-options.ts index e816904588..7720b1c023 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/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 244f49c9f4..0000000000 --- a/bindings/python/examples/how_tos/account_output/governance_transition.py +++ /dev/null @@ -1,75 +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. - -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}") - -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.transactionId}') - -# Wait for transaction to get included -blockId = account.reissue_transaction_until_included( - transaction.transactionId) -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 d2d2ad5e82..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.unlockConditions, - state_index=int(account_output.stateIndex) + 1, - state_metadata=utf8_to_hex(NEW_STATE_METADATA), - foundry_counter=account_output.foundryCounter, - immutable_features=account_output.immutableFeatures, - 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.transactionId}') - -# Wait for transaction to get included -blockId = account.reissue_transaction_until_included( - transaction.transactionId) -print(f'Block included: {os.environ["EXPLORER_URL"]}/block/{blockId}') diff --git a/bindings/python/iota_sdk/client/client.py b/bindings/python/iota_sdk/client/client.py index 2d501d06e2..c8772656f5 100644 --- a/bindings/python/iota_sdk/client/client.py +++ b/bindings/python/iota_sdk/client/client.py @@ -203,8 +203,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/tests/test_block.py b/bindings/python/tests/test_block.py index d59654dcd5..cc226838ca 100644 --- a/bindings/python/tests/test_block.py +++ b/bindings/python/tests/test_block.py @@ -51,7 +51,7 @@ def test_block(): "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 76c9f7aee1..94ff5077a8 100644 --- a/bindings/python/tests/test_output.py +++ b/bindings/python/tests/test_output.py @@ -114,8 +114,6 @@ def test_output(): "mana": "168200", "amount": "168200", "accountId": "0x8d073d15074834785046d9cacec7ac4d672dcb6dad342624a936f3c4334520f1", - "stateIndex": 4, - "stateMetadata": "0x14bd8ce73814dfe5d6f30f65a11bfd6d0b9e5d29c90aff9d71ec4b3d3a2984386a312295fc8b79cd", "foundryCounter": 0, "unlockConditions": [ { @@ -151,8 +149,6 @@ def test_output(): "mana": "55100", "amount": "55100", "accountId": "0x5380cce0ac342b8fa3e9c4f46d5b473ee9e824f0017fe43682dca77e6b875354", - "stateIndex": 2, - "stateMetadata": "0x", "foundryCounter": 1, "unlockConditions": [ { From 9a7af788076eae2a71dcc9991e7535d68855ccb2 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 4 Oct 2023 10:30:31 +0200 Subject: [PATCH 12/56] More changes :sadcat: --- .../client/13-build-account-output.ts | 10 ++------ .../examples/evm/send-evm-transaction.ts | 5 ++-- .../how_tos/outputs/unlock-conditions.ts | 16 ------------- .../lib/types/client/query-parameters.ts | 3 +-- .../tests/client/outputBuilders.spec.ts | 7 ++---- .../python/examples/client/build_alias.py | 7 +++--- .../how_tos/outputs/unlock_conditions.py | 16 ------------- bindings/python/iota_sdk/types/output.py | 6 ++--- bindings/python/iota_sdk/types/unlock.py | 3 ++- .../python/iota_sdk/types/unlock_condition.py | 3 ++- .../02_get_account_outputs.rs | 7 +----- .../api/block_builder/input_selection/mod.rs | 13 +++++----- .../node_api/indexer/query_parameters.rs | 3 +-- sdk/src/client/node_api/indexer/routes.rs | 3 +-- .../unlock_condition/governor_address.rs | 3 +-- .../state_controller_address.rs | 3 +-- sdk/src/types/block/rand/address.rs | 10 ++++++-- .../block/rand/output/unlock_condition.rs | 22 ++++++++--------- .../addresses/output_ids/account_foundry.rs | 24 +++---------------- 19 files changed, 50 insertions(+), 114 deletions(-) diff --git a/bindings/nodejs/examples/client/13-build-account-output.ts b/bindings/nodejs/examples/client/13-build-account-output.ts index 326f3a565f..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' }); @@ -39,12 +38,7 @@ async function run() { accountId: '0x0000000000000000000000000000000000000000000000000000000000000000', 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/evm/send-evm-transaction.ts b/bindings/nodejs/examples/evm/send-evm-transaction.ts index ccc7450819..5604204f76 100644 --- a/bindings/nodejs/examples/evm/send-evm-transaction.ts +++ b/bindings/nodejs/examples/evm/send-evm-transaction.ts @@ -97,9 +97,8 @@ async function run(): Promise { // 6. Send signed transaction const hexSignedTransaction = getHexEncodedTransaction(signedTransaction); - const sentTransaction = await provider.eth.sendSignedTransaction( - hexSignedTransaction, - ); + const sentTransaction = + await provider.eth.sendSignedTransaction(hexSignedTransaction); console.log('sent Transaction', sentTransaction); } catch (error) { console.error('Error: ', error); diff --git a/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts b/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts index a8fc1d3512..723a23ce7c 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'; @@ -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, diff --git a/bindings/nodejs/lib/types/client/query-parameters.ts b/bindings/nodejs/lib/types/client/query-parameters.ts index 6afbf28c13..f268145826 100644 --- a/bindings/nodejs/lib/types/client/query-parameters.ts +++ b/bindings/nodejs/lib/types/client/query-parameters.ts @@ -27,8 +27,7 @@ export type QueryParameter = /** Query parameters for filtering Account Outputs */ export type AccountQueryParameter = - | StateController - | Governor + | Address | Issuer | Sender | CommonQueryParameters; 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/python/examples/client/build_alias.py b/bindings/python/examples/client/build_alias.py index daf4ae7813..540c1d210f 100644 --- a/bindings/python/examples/client/build_alias.py +++ b/bindings/python/examples/client/build_alias.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() @@ -21,8 +21,7 @@ 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)), 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/types/output.py b/bindings/python/iota_sdk/types/output.py index a42923d6fb..26d138b2b7 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): @@ -106,8 +106,8 @@ class AccountOutput(Output): account_id: HexStr state_index: int foundry_counter: int - unlock_conditions: List[Union[StateControllerAddressUnlockCondition, - GovernorAddressUnlockCondition]] = field( + unlock_conditions: List[Union[AddressUnlockCondition, + ]] = field( metadata=config( decoder=deserialize_unlock_conditions )) diff --git a/bindings/python/iota_sdk/types/unlock.py b/bindings/python/iota_sdk/types/unlock.py index 82e71e486e..2851b9085b 100644 --- a/bindings/python/iota_sdk/types/unlock.py +++ b/bindings/python/iota_sdk/types/unlock.py @@ -77,7 +77,8 @@ class NftUnlock: type: int = field(default_factory=lambda: int(UnlockType.Nft), init=False) -def deserialize_unlock(d: Dict[str, Any]) -> Union[SignatureUnlock, ReferenceUnlock, AccountUnlock, NftUnlock]: +def deserialize_unlock(d: Dict[str, Any]) -> Union[SignatureUnlock, + ReferenceUnlock, AccountUnlock, NftUnlock]: """ Takes a dictionary as input and returns an instance of a specific class based on the value of the 'type' key in the dictionary. diff --git a/bindings/python/iota_sdk/types/unlock_condition.py b/bindings/python/iota_sdk/types/unlock_condition.py index e13f118516..6676f9681b 100644 --- a/bindings/python/iota_sdk/types/unlock_condition.py +++ b/bindings/python/iota_sdk/types/unlock_condition.py @@ -179,7 +179,8 @@ def deserialize_unlock_condition(d: Dict[str, Any]) -> UnlockConditionUnion: raise Exception(f'invalid unlock condition type: {uc_type}') -def deserialize_unlock_conditions(dicts: List[Dict[str, Any]]) -> List[UnlockConditionUnion]: +def deserialize_unlock_conditions( + dicts: List[Dict[str, Any]]) -> List[UnlockConditionUnion]: """ Takes a list of dictionaries as input and returns a list with specific instances of a classes based on the value of the 'type' key in the dictionary. diff --git a/sdk/examples/client/node_api_indexer/02_get_account_outputs.rs b/sdk/examples/client/node_api_indexer/02_get_account_outputs.rs index 3a1eee84a3..e341993dbe 100644 --- a/sdk/examples/client/node_api_indexer/02_get_account_outputs.rs +++ b/sdk/examples/client/node_api_indexer/02_get_account_outputs.rs @@ -40,12 +40,7 @@ async fn main() -> Result<()> { .parse::()?; // Get output IDs of account outputs that can be controlled by this address. - let output_ids_response = client - .account_output_ids([ - QueryParameter::Governor(address), - QueryParameter::StateController(address), - ]) - .await?; + let output_ids_response = client.account_output_ids([QueryParameter::Address(address)]).await?; println!("Account output IDs: {output_ids_response:#?}"); 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 6e6e125e40..c51f010e5f 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -207,14 +207,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. - // TODO remove ? - if input.output.is_account() { - return true; - } + // TODO what about other kinds? // Filter out non basic/foundry/nft outputs. - else if !input.output.is_basic() && !input.output.is_foundry() && !input.output.is_nft() { + if !input.output.is_basic() + && !input.output.is_account() + && !input.output.is_foundry() + && !input.output.is_nft() + { return false; } diff --git a/sdk/src/client/node_api/indexer/query_parameters.rs b/sdk/src/client/node_api/indexer/query_parameters.rs index e52b97377d..2d921b627b 100644 --- a/sdk/src/client/node_api/indexer/query_parameters.rs +++ b/sdk/src/client/node_api/indexer/query_parameters.rs @@ -247,8 +247,7 @@ pub(crate) fn verify_query_parameters_account_outputs( ) -> Result { verify_query_parameters!( query_parameters, - QueryParameter::StateController, - QueryParameter::Governor, + QueryParameter::Address, QueryParameter::Issuer, QueryParameter::Sender, QueryParameter::HasNativeTokens, diff --git a/sdk/src/client/node_api/indexer/routes.rs b/sdk/src/client/node_api/indexer/routes.rs index 87edf4ec2a..3026ddcb79 100644 --- a/sdk/src/client/node_api/indexer/routes.rs +++ b/sdk/src/client/node_api/indexer/routes.rs @@ -59,10 +59,9 @@ impl ClientInner { self.get_output_ids(route, query_parameters, true, false).await } - // TODO /// 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/types/block/output/unlock_condition/governor_address.rs b/sdk/src/types/block/output/unlock_condition/governor_address.rs index 6530d52e58..868c888013 100644 --- a/sdk/src/types/block/output/unlock_condition/governor_address.rs +++ b/sdk/src/types/block/output/unlock_condition/governor_address.rs @@ -5,9 +5,8 @@ use derive_more::From; use crate::types::block::address::Address; -// TODO /// 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(Copy, 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 127026dea3..b7837b672d 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 @@ -5,9 +5,8 @@ use derive_more::From; use crate::types::block::address::Address; -// TODO /// 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(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, From, packable::Packable)] pub struct StateControllerAddressUnlockCondition(Address); diff --git a/sdk/src/types/block/rand/address.rs b/sdk/src/types/block/rand/address.rs index fcb4a79c67..5f9416efb5 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,18 @@ 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())) +} + /// Generates a random address. pub fn rand_address() -> Address { match rand_number::() % 3 { 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/unlock_condition.rs b/sdk/src/types/block/rand/output/unlock_condition.rs index 9a0c91cf08..e54d0576b9 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`]. @@ -19,26 +19,26 @@ pub fn rand_address_unlock_condition() -> AddressUnlockCondition { /// Generates a random [`StateControllerAddressUnlockCondition`]. 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 `account_id`. -pub fn rand_governor_address_unlock_condition_different_from(account_id: &AccountId) -> GovernorAddressUnlockCondition { +/// 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::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(); } } diff --git a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs index d91f9ee146..0bc6eae374 100644 --- a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs +++ b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs @@ -43,13 +43,7 @@ where { output_ids.extend( client - .account_output_ids([QueryParameter::Governor(bech32_address)]) - .await? - .items, - ); - output_ids.extend( - client - .account_output_ids([QueryParameter::StateController(bech32_address)]) + .account_output_ids([QueryParameter::Address(bech32_address)]) .await? .items, ); @@ -58,24 +52,12 @@ where #[cfg(not(target_family = "wasm"))] { let tasks = [ - // Get outputs where the address is in the governor address unlock condition - async move { - let client = client.clone(); - task::spawn(async move { - client - .account_output_ids([QueryParameter::Governor(bech32_address)]) - .await - .map_err(From::from) - }) - .await - } - .boxed(), - // Get outputs where the address is in the state controller unlock condition + // Get outputs where the address is in the address unlock condition async move { let client = client.clone(); task::spawn(async move { client - .account_output_ids([QueryParameter::StateController(bech32_address)]) + .account_output_ids([QueryParameter::Address(bech32_address)]) .await .map_err(From::from) }) From f77230869f729e98e499220a6d4b9a2b9d8fa813 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 11:08:45 +0200 Subject: [PATCH 13/56] Set AnchorAddress type --- sdk/src/types/block/address/anchor.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/src/types/block/address/anchor.rs b/sdk/src/types/block/address/anchor.rs index ffbd15c8b6..24a18d290b 100644 --- a/sdk/src/types/block/address/anchor.rs +++ b/sdk/src/types/block/address/anchor.rs @@ -14,8 +14,7 @@ pub struct AnchorAddress(AnchorId); impl AnchorAddress { /// The [`Address`](crate::types::block::address::Address) kind of an [`AnchorAddress`]. - /// TODO - pub const KIND: u8 = 255; + pub const KIND: u8 = 48; /// The length of an [`AnchorAddress`]. pub const LENGTH: usize = AnchorId::LENGTH; From e1d45f3087a840c6a0eeb81f2313d764e46fa3f5 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 11:14:11 +0200 Subject: [PATCH 14/56] Add AnchorOutputs address capability --- sdk/src/types/block/address/restricted.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/types/block/address/restricted.rs b/sdk/src/types/block/address/restricted.rs index 1c6485e898..b418c27a91 100644 --- a/sdk/src/types/block/address/restricted.rs +++ b/sdk/src/types/block/address/restricted.rs @@ -83,9 +83,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; @@ -94,6 +97,8 @@ impl AddressCapabilityFlag { const ACCOUNT_OUTPUTS: u8 = 0b00100000; const NFT_OUTPUTS: u8 = 0b01000000; const DELEGATION_OUTPUTS: u8 = 0b10000000; + // Byte 1 + const ANCHOR_OUTPUTS: u8 = 0b10000000; /// Converts the flag into the byte representation. pub fn as_byte(&self) -> u8 { @@ -106,6 +111,7 @@ impl AddressCapabilityFlag { Self::AccountOutputs => Self::ACCOUNT_OUTPUTS, Self::NftOutputs => Self::NFT_OUTPUTS, Self::DelegationOutputs => Self::DELEGATION_OUTPUTS, + Self::AnchorOutputs => Self::ANCHOR_OUTPUTS, } } @@ -120,6 +126,7 @@ impl AddressCapabilityFlag { | Self::AccountOutputs | Self::NftOutputs | Self::DelegationOutputs => 0, + Self::AnchorOutputs => 1, } } @@ -134,6 +141,7 @@ impl AddressCapabilityFlag { Self::AccountOutputs, Self::NftOutputs, Self::DelegationOutputs, + Self::AnchorOutputs, ] .into_iter() } From cf5c0c68455142a137a16c6070f4ecc3031912f0 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 11:37:28 +0200 Subject: [PATCH 15/56] Add AnchorUnlock --- sdk/src/types/block/address/mod.rs | 1 + sdk/src/types/block/error.rs | 6 +++ sdk/src/types/block/unlock/anchor.rs | 70 ++++++++++++++++++++++++++++ sdk/src/types/block/unlock/mod.rs | 16 ++++++- 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 sdk/src/types/block/unlock/anchor.rs diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index 31383441f4..c5201e0e0c 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -214,6 +214,7 @@ impl Address { return Err(TransactionFailureReason::InvalidInputUnlock); } } + (Self::Anchor(_), Unlock::Anchor(_)) => todo!(), _ => return Err(TransactionFailureReason::InvalidInputUnlock), } diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index ef0b58dcfc..39d0a4d952 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -48,6 +48,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, @@ -220,6 +222,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::InvalidAddressCapabilitiesCount(e) => write!(f, "invalid capabilities count: {e}"), Self::InvalidBlockKind(k) => write!(f, "invalid block kind: {k}"), @@ -322,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"), diff --git a/sdk/src/types/block/unlock/anchor.rs b/sdk/src/types/block/unlock/anchor.rs new file mode 100644 index 0000000000..a8103d9914 --- /dev/null +++ b/sdk/src/types/block/unlock/anchor.rs @@ -0,0 +1,70 @@ +// Copyright 2020-2021 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) + } + } + + 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 bbd74b8f56..ec2c89d3ae 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, } } } @@ -138,6 +147,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)); + } + } } } } From 77e4acee54a3639fc17a4cf3ba953d62e9bba962 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 13:17:11 +0200 Subject: [PATCH 16/56] Fix ANCHOR_OUTPUTS capability --- sdk/src/types/block/address/restricted.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/types/block/address/restricted.rs b/sdk/src/types/block/address/restricted.rs index b418c27a91..46ad7a0ac5 100644 --- a/sdk/src/types/block/address/restricted.rs +++ b/sdk/src/types/block/address/restricted.rs @@ -98,7 +98,7 @@ impl AddressCapabilityFlag { const NFT_OUTPUTS: u8 = 0b01000000; const DELEGATION_OUTPUTS: u8 = 0b10000000; // Byte 1 - const ANCHOR_OUTPUTS: u8 = 0b10000000; + const ANCHOR_OUTPUTS: u8 = 0b00000001; /// Converts the flag into the byte representation. pub fn as_byte(&self) -> u8 { From 13799e9febfcd4ff42ddfdcab2ac881698bf8e0b Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 14:50:32 +0200 Subject: [PATCH 17/56] Fix test compilation --- sdk/tests/client/input_selection/foundry_outputs.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index 078e5b60dd..1371f8496e 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -954,10 +954,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) @@ -993,10 +990,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); From a39870e2c0db6ef03fae13b3fb5c75e5afed7bbc Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 14:59:29 +0200 Subject: [PATCH 18/56] Add DESTROY_ANCHOR_OUTPUTS tx capability --- sdk/src/types/block/output/anchor.rs | 11 ++++++++++- .../block/payload/transaction/essence/regular.rs | 9 +++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index 7b8263d9bf..308c9a87b5 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -25,6 +25,7 @@ use crate::types::{ NativeTokens, Output, OutputBuilderAmount, OutputId, Rent, RentStructure, StateTransitionError, StateTransitionVerifier, }, + payload::transaction::TransactionCapabilityFlag, protocol::ProtocolParameters, semantic::{TransactionFailureReason, ValidationContext}, unlock::Unlock, @@ -595,7 +596,15 @@ impl StateTransitionVerifier for AnchorOutput { ) } - fn destruction(_current_state: &Self, _context: &ValidationContext<'_>) -> Result<(), StateTransitionError> { + fn destruction(_current_state: &Self, context: &ValidationContext<'_>) -> Result<(), StateTransitionError> { + if !context + .essence + .capabilities() + .has_capability(TransactionCapabilityFlag::DestroyAnchorOutputs) + { + // TODO: add a variant https://github.com/iotaledger/iota-sdk/issues/1430 + return Err(StateTransitionError::UnsupportedStateTransition); + } Ok(()) } } diff --git a/sdk/src/types/block/payload/transaction/essence/regular.rs b/sdk/src/types/block/payload/transaction/essence/regular.rs index 46f8e816c0..dabd789fa0 100644 --- a/sdk/src/types/block/payload/transaction/essence/regular.rs +++ b/sdk/src/types/block/payload/transaction/essence/regular.rs @@ -442,6 +442,7 @@ pub enum TransactionCapabilityFlag { DestroyAccountOutputs, DestroyFoundryOutputs, DestroyNftOutputs, + DestroyAnchorOutputs, } impl TransactionCapabilityFlag { @@ -450,10 +451,11 @@ impl TransactionCapabilityFlag { const DESTROY_ACCOUNT_OUTPUTS: u8 = 0b00000100; const DESTROY_FOUNDRY_OUTPUTS: u8 = 0b00001000; const DESTROY_NFT_OUTPUTS: u8 = 0b00010000; + const DESTROY_ANCHOR_OUTPUTS: u8 = 0b00100000; } impl CapabilityFlag for TransactionCapabilityFlag { - type Iterator = core::array::IntoIter; + type Iterator = core::array::IntoIter; fn as_byte(&self) -> u8 { match self { @@ -462,6 +464,7 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::DestroyAccountOutputs => Self::DESTROY_ACCOUNT_OUTPUTS, Self::DestroyFoundryOutputs => Self::DESTROY_FOUNDRY_OUTPUTS, Self::DestroyNftOutputs => Self::DESTROY_NFT_OUTPUTS, + Self::DestroyAnchorOutputs => Self::DESTROY_ANCHOR_OUTPUTS, } } @@ -471,7 +474,8 @@ impl CapabilityFlag for TransactionCapabilityFlag { | Self::BurnMana | Self::DestroyAccountOutputs | Self::DestroyFoundryOutputs - | Self::DestroyNftOutputs => 0, + | Self::DestroyNftOutputs + | Self::DestroyAnchorOutputs => 0, } } @@ -482,6 +486,7 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::DestroyAccountOutputs, Self::DestroyFoundryOutputs, Self::DestroyNftOutputs, + Self::DestroyAnchorOutputs, ] .into_iter() } From e49f4ab071089fd09993563577ac445146ca5527 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 16:00:24 +0200 Subject: [PATCH 19/56] Add Anchor address cap semantic validation --- sdk/src/types/block/semantic.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/src/types/block/semantic.rs b/sdk/src/types/block/semantic.rs index 6913d4cbfe..0bc62bf97f 100644 --- a/sdk/src/types/block/semantic.rs +++ b/sdk/src/types/block/semantic.rs @@ -402,6 +402,7 @@ pub fn semantic_validation( 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 From 25d24f21461eeafd331df13c0f563fe06199dcc4 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Wed, 18 Oct 2023 16:02:12 +0200 Subject: [PATCH 20/56] Fix compilation --- sdk/src/types/block/output/mod.rs | 1 + sdk/src/types/block/semantic.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index 0e8c601b7d..ee6c27d923 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -190,6 +190,7 @@ impl Output { Self::Foundry(_) => 0, Self::Nft(output) => output.mana(), Self::Delegation(_) => 0, + Self::Anchor(output) => output.mana(), } } diff --git a/sdk/src/types/block/semantic.rs b/sdk/src/types/block/semantic.rs index 0bc62bf97f..3077ce8ccb 100644 --- a/sdk/src/types/block/semantic.rs +++ b/sdk/src/types/block/semantic.rs @@ -402,6 +402,7 @@ pub fn semantic_validation( Output::Account(_) => !address.has_capability(AddressCapabilityFlag::AccountOutputs), Output::Nft(_) => !address.has_capability(AddressCapabilityFlag::NftOutputs), Output::Delegation(_) => !address.has_capability(AddressCapabilityFlag::DelegationOutputs), + // TODO do we really want to handle it? Output::Anchor(_) => !address.has_capability(AddressCapabilityFlag::AnchorOutputs), _ => false, } { From 182da92da45e429c6d81bad4747702d171871662 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 12:30:31 +0200 Subject: [PATCH 21/56] Temporarily disable test until TIP is updated --- sdk/tests/types/address/restricted.rs | 39 ++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/sdk/tests/types/address/restricted.rs b/sdk/tests/types/address/restricted.rs index 0db5b3ec22..d5e3c0e4b3 100644 --- a/sdk/tests/types/address/restricted.rs +++ b/sdk/tests/types/address/restricted.rs @@ -64,12 +64,13 @@ fn restricted_ed25519() { "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcq3l9hek" ); - // Restricted Ed25519 Address (Every Capability Allowed) - address.set_allowed_capabilities(AddressCapabilities::all()); - assert_eq!( - address.clone().to_bech32_unchecked("iota"), - "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcplupydhwt" - ); + // TODO reenable when TIP is updated + // // Restricted Ed25519 Address (Every Capability Allowed) + // address.set_allowed_capabilities(AddressCapabilities::all()); + // assert_eq!( + // address.clone().to_bech32_unchecked("iota"), + // "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcplupydhwt" + // ); address.set_allowed_capabilities(AddressCapabilities::none()); assert_eq!( @@ -106,12 +107,13 @@ fn restricted_account() { "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqqdyjudm" ); - // Restricted Account Address (Every Capability Allowed) - address.set_allowed_capabilities(AddressCapabilities::all()); - assert_eq!( - address.clone().to_bech32_unchecked("iota"), - "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqplurds6sq" - ); + // TODO reenable when TIP is updated + // // Restricted Account Address (Every Capability Allowed) + // address.set_allowed_capabilities(AddressCapabilities::all()); + // assert_eq!( + // address.clone().to_bech32_unchecked("iota"), + // "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqplurds6sq" + // ); address.set_allowed_capabilities(AddressCapabilities::none()); assert_eq!( @@ -148,12 +150,13 @@ fn restricted_nft() { "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcqek0lex" ); - // Restricted NFT Address (Every Capability Allowed) - address.set_allowed_capabilities(AddressCapabilities::all()); - assert_eq!( - address.clone().to_bech32_unchecked("iota"), - "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcpluts738a" - ); + // TODO reenable when TIP is updated + // // Restricted NFT Address (Every Capability Allowed) + // address.set_allowed_capabilities(AddressCapabilities::all()); + // assert_eq!( + // address.clone().to_bech32_unchecked("iota"), + // "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcpluts738a" + // ); address.set_allowed_capabilities(AddressCapabilities::none()); assert_eq!( From 24f303e951348a5b1ea6a144df6efda85706131c Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 12:53:13 +0200 Subject: [PATCH 22/56] Fix some tests --- .../api/block_builder/input_selection/mod.rs | 1 + .../client/input_selection/account_outputs.rs | 56 +++++++++++++------ sdk/tests/client/input_selection/burn.rs | 25 +++++++-- .../client/input_selection/foundry_outputs.rs | 27 ++++++--- 4 files changed, 78 insertions(+), 31 deletions(-) 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 39d91e0279..3641d3ace9 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -390,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())?; diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index dc3a0a2f25..e0051c4a20 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -1049,7 +1049,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(); @@ -1077,22 +1077,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(); @@ -1120,18 +1131,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(); + .select() + .unwrap(); - assert!(matches!( - selected, - Err(Error::UnfulfillableRequirement(Requirement::Account(account_id))) 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] @@ -1177,7 +1199,7 @@ 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!( diff --git a/sdk/tests/client/input_selection/burn.rs b/sdk/tests/client/input_selection/burn.rs index fa428721a2..e65ac95085 100644 --- a/sdk/tests/client/input_selection/burn.rs +++ b/sdk/tests/client/input_selection/burn.rs @@ -895,7 +895,7 @@ fn burn_foundry_and_its_account() { let selected = InputSelection::new( inputs.clone(), - outputs, + outputs.clone(), addresses([BECH32_ADDRESS_ED25519_0]), protocol_parameters, ) @@ -904,10 +904,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))) 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/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index 1371f8496e..8374b1eeac 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -739,7 +739,7 @@ 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([ @@ -769,18 +769,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))) 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] From cf58c6e48ddcb6edb1fce0c6ceb6b78d1a1abedf Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 14:11:57 +0200 Subject: [PATCH 23/56] Last failing tests --- .../client/input_selection/account_outputs.rs | 161 +----------------- 1 file changed, 1 insertion(+), 160 deletions(-) diff --git a/sdk/tests/client/input_selection/account_outputs.rs b/sdk/tests/client/input_selection/account_outputs.rs index e0051c4a20..1a300d4ff3 100644 --- a/sdk/tests/client/input_selection/account_outputs.rs +++ b/sdk/tests/client/input_selection/account_outputs.rs @@ -16,7 +16,7 @@ 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_ED25519_0, - BECH32_ADDRESS_ED25519_1, BECH32_ADDRESS_ED25519_2, BECH32_ADDRESS_NFT_1, TOKEN_SUPPLY, + BECH32_ADDRESS_ED25519_1, BECH32_ADDRESS_NFT_1, TOKEN_SUPPLY, }; #[test] @@ -1455,162 +1455,3 @@ fn remainder_address_in_state_controller() { } }); } - -#[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, - BECH32_ADDRESS_ED25519_0, - 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, - 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, - 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 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, - BECH32_ADDRESS_ED25519_0, - 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, - BECH32_ADDRESS_ED25519_0, - 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() - )); -} From 475be346f43374f3599e534aa8253a50b91c0a4d Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 14:32:27 +0200 Subject: [PATCH 24/56] Some nits --- .../nodejs/examples/evm/send-evm-transaction.ts | 5 +++-- sdk/src/types/block/address/mod.rs | 17 +---------------- sdk/src/types/block/error.rs | 5 ----- .../client/input_selection/foundry_outputs.rs | 7 ------- sdk/tests/client/node_api/indexer.rs | 1 - 5 files changed, 4 insertions(+), 31 deletions(-) diff --git a/bindings/nodejs/examples/evm/send-evm-transaction.ts b/bindings/nodejs/examples/evm/send-evm-transaction.ts index 5604204f76..ccc7450819 100644 --- a/bindings/nodejs/examples/evm/send-evm-transaction.ts +++ b/bindings/nodejs/examples/evm/send-evm-transaction.ts @@ -97,8 +97,9 @@ async function run(): Promise { // 6. Send signed transaction const hexSignedTransaction = getHexEncodedTransaction(signedTransaction); - const sentTransaction = - await provider.eth.sendSignedTransaction(hexSignedTransaction); + const sentTransaction = await provider.eth.sendSignedTransaction( + hexSignedTransaction, + ); console.log('sent Transaction', sentTransaction); } catch (error) { console.error('Error: ', error); diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index ee7504ceae..b67611d7ba 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -90,22 +90,7 @@ impl Address { } } - def_is_as_opt!(Address: Ed25519, Account, Nft, ImplicitAccountCreation, Restricted); - - /// Checks whether the address is an [`AnchorAddress`]. - pub fn is_anchor(&self) -> bool { - matches!(self, Self::Anchor(_)) - } - - /// Gets the address as an actual [`AnchorAddress`]. - /// PANIC: do not call on a non-anchor address. - pub fn as_anchor(&self) -> &AnchorAddress { - if let Self::Anchor(address) = self { - address - } else { - panic!("as_anchor called on a non-anchor address"); - } - } + def_is_as_opt!(Address: Ed25519, Account, Nft, ImplicitAccountCreation, Restricted, Anchor); /// Tries to create an [`Address`] from a bech32 encoded string. pub fn try_from_bech32(address: impl AsRef) -> Result { diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index 7ae28adbe6..9a047dcf45 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -156,8 +156,6 @@ pub enum Error { }, BlockIssuerKeysNotUniqueSorted, RemainingBytesAfterBlock, - // TODO remove? - SelfControlledAccountOutput(AccountId), SelfControlledAnchorOutput(AnchorId), SelfDepositAccount(AccountId), SelfDepositNft(NftId), @@ -363,9 +361,6 @@ 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}") } diff --git a/sdk/tests/client/input_selection/foundry_outputs.rs b/sdk/tests/client/input_selection/foundry_outputs.rs index 8374b1eeac..41f719b4ec 100644 --- a/sdk/tests/client/input_selection/foundry_outputs.rs +++ b/sdk/tests/client/input_selection/foundry_outputs.rs @@ -98,13 +98,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] diff --git a/sdk/tests/client/node_api/indexer.rs b/sdk/tests/client/node_api/indexer.rs index c1c221e625..8b162319d7 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 = AliasOutputBuilder::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())?; From 0aa8989932ab86a85b366fd8f409f3b18a89374f Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:05:32 +0200 Subject: [PATCH 25/56] Fix test --- .../nodejs/tests/client/utxoMethods.spec.ts | 2 +- bindings/nodejs/yarn.lock | 7624 ++++++++--------- 2 files changed, 3758 insertions(+), 3868 deletions(-) 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 ea11c101f6..00b5412f5f 100644 --- a/bindings/nodejs/yarn.lock +++ b/bindings/nodejs/yarn.lock @@ -3,35 +3,35 @@ "@aashutoshrathi/word-wrap@^1.2.3": - "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" - "resolved" "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" - "version" "1.2.6" + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.0": - "integrity" "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==" - "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - "version" "2.2.1" + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + 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": - "integrity" "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz" - "version" "7.22.10" + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== dependencies: "@babel/highlight" "^7.22.10" - "chalk" "^2.4.2" + chalk "^2.4.2" "@babel/compat-data@^7.22.9": - "integrity" "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==" - "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" - "version" "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== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": - "integrity" "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz" - "version" "7.22.10" +"@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== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.10" @@ -43,64 +43,64 @@ "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.10" "@babel/types" "^7.22.10" - "convert-source-map" "^1.7.0" - "debug" "^4.1.0" - "gensync" "^1.0.0-beta.2" - "json5" "^2.2.2" - "semver" "^6.3.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" "@babel/generator@^7.22.10", "@babel/generator@^7.7.2": - "integrity" "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==" - "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz" - "version" "7.22.10" + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" - "jsesc" "^2.5.1" + jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.22.10": - "integrity" "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz" - "version" "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== dependencies: "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "browserslist" "^4.21.9" - "lru-cache" "^5.1.1" - "semver" "^6.3.1" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": - "integrity" "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" - "version" "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-function-name@^7.22.5": - "integrity" "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - "version" "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== dependencies: "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" "@babel/helper-hoist-variables@^7.22.5": - "integrity" "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==" - "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.22.5": - "integrity" "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" - "version" "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== dependencies: "@babel/types" "^7.22.5" "@babel/helper-module-transforms@^7.22.9": - "integrity" "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" - "version" "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== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" @@ -109,173 +109,173 @@ "@babel/helper-validator-identifier" "^7.22.5" "@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": - "integrity" "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" - "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-simple-access@^7.22.5": - "integrity" "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==" - "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": - "integrity" "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==" - "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - "version" "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" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.22.5": - "integrity" "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" - "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== "@babel/helper-validator-identifier@^7.22.5": - "integrity" "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - "version" "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-option@^7.22.5": - "integrity" "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" - "version" "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/helpers@^7.22.10": - "integrity" "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==" - "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz" - "version" "7.22.10" + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz" + integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== dependencies: "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.10" "@babel/types" "^7.22.10" "@babel/highlight@^7.22.10": - "integrity" "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz" - "version" "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== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - "chalk" "^2.4.2" - "js-tokens" "^4.0.0" + 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": - "integrity" "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz" - "version" "7.22.10" + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz" + integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== "@babel/plugin-syntax-async-generators@^7.8.4": - "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - "version" "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" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": - "integrity" "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - "version" "7.12.13" + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": - "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": - "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - "version" "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" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - "integrity" "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - "version" "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" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": - "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": - "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - "version" "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" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - "version" "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" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - "version" "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" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": - "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - "version" "7.14.5" + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - "integrity" "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/template@^7.22.5", "@babel/template@^7.3.3": - "integrity" "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==" - "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== dependencies: "@babel/code-frame" "^7.22.5" "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" "@babel/traverse@^7.22.10": - "integrity" "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==" - "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz" - "version" "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== dependencies: "@babel/code-frame" "^7.22.10" "@babel/generator" "^7.22.10" @@ -285,106 +285,106 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/parser" "^7.22.10" "@babel/types" "^7.22.10" - "debug" "^4.1.0" - "globals" "^11.1.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": - "integrity" "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz" - "version" "7.22.10" + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" - "to-fast-properties" "^2.0.0" + to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": - "integrity" "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - "version" "0.2.3" + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@eslint-community/eslint-utils@^4.2.0": - "integrity" "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==" - "resolved" "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - "version" "4.4.0" + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - "eslint-visitor-keys" "^3.3.0" + eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - "integrity" "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==" - "resolved" "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz" - "version" "4.6.2" + version "4.6.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== "@eslint/eslintrc@^2.1.2": - "integrity" "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "ajv" "^6.12.4" - "debug" "^4.3.2" - "espree" "^9.6.0" - "globals" "^13.19.0" - "ignore" "^5.2.0" - "import-fresh" "^3.2.1" - "js-yaml" "^4.1.0" - "minimatch" "^3.1.2" - "strip-json-comments" "^3.1.1" + version "2.1.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" "@eslint/js@^8.47.0": - "integrity" "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==" - "resolved" "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz" - "version" "8.47.0" + version "8.47.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz" + integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== "@humanwhocodes/config-array@^0.11.10": - "integrity" "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" - "version" "0.11.10" + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" - "debug" "^4.1.1" - "minimatch" "^3.0.5" + debug "^4.1.1" + minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": - "integrity" "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - "version" "1.0.1" + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": - "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - "version" "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== "@istanbuljs/load-nyc-config@^1.0.0": - "integrity" "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==" - "resolved" "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - "version" "1.1.0" + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - "camelcase" "^5.3.1" - "find-up" "^4.1.0" - "get-package-type" "^0.1.0" - "js-yaml" "^3.13.1" - "resolve-from" "^5.0.0" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - "integrity" "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - "resolved" "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - "version" "0.1.3" + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.6.2": - "integrity" "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==" - "resolved" "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz" - "version" "29.6.2" + version "29.6.2" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz" + integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== dependencies: "@jest/types" "^29.6.1" "@types/node" "*" - "chalk" "^4.0.0" - "jest-message-util" "^29.6.2" - "jest-util" "^29.6.2" - "slash" "^3.0.0" + chalk "^4.0.0" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" "@jest/core@^29.6.2": - "integrity" "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==" - "resolved" "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz" - "version" "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== dependencies: "@jest/console" "^29.6.2" "@jest/reporters" "^29.6.2" @@ -392,80 +392,80 @@ "@jest/transform" "^29.6.2" "@jest/types" "^29.6.1" "@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" - "micromatch" "^4.0.4" - "pretty-format" "^29.6.2" - "slash" "^3.0.0" - "strip-ansi" "^6.0.0" + 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" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-ansi "^6.0.0" "@jest/environment@^29.6.2": - "integrity" "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==" - "resolved" "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz" - "version" "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== dependencies: "@jest/fake-timers" "^29.6.2" "@jest/types" "^29.6.1" "@types/node" "*" - "jest-mock" "^29.6.2" + jest-mock "^29.6.2" "@jest/expect-utils@^29.6.2": - "integrity" "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==" - "resolved" "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz" - "version" "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== dependencies: - "jest-get-type" "^29.4.3" + jest-get-type "^29.4.3" "@jest/expect@^29.6.2": - "integrity" "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==" - "resolved" "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz" - "version" "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== dependencies: - "expect" "^29.6.2" - "jest-snapshot" "^29.6.2" + expect "^29.6.2" + jest-snapshot "^29.6.2" "@jest/fake-timers@^29.6.2": - "integrity" "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==" - "resolved" "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz" - "version" "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== dependencies: "@jest/types" "^29.6.1" "@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.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" "@jest/globals@^29.6.2": - "integrity" "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==" - "resolved" "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz" - "version" "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== dependencies: "@jest/environment" "^29.6.2" "@jest/expect" "^29.6.2" "@jest/types" "^29.6.1" - "jest-mock" "^29.6.2" + jest-mock "^29.6.2" "@jest/reporters@^29.6.2": - "integrity" "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==" - "resolved" "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz" - "version" "29.6.2" + version "29.6.2" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^29.6.2" @@ -474,169 +474,169 @@ "@jest/types" "^29.6.1" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" - "chalk" "^4.0.0" - "collect-v8-coverage" "^1.0.0" - "exit" "^0.1.2" - "glob" "^7.1.3" - "graceful-fs" "^4.2.9" - "istanbul-lib-coverage" "^3.0.0" - "istanbul-lib-instrument" "^5.1.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" - "slash" "^3.0.0" - "string-length" "^4.0.1" - "strip-ansi" "^6.0.0" - "v8-to-istanbul" "^9.0.1" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.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" + 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": - "integrity" "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==" - "resolved" "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" - "version" "29.6.0" + version "29.6.0" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.0": - "integrity" "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==" - "resolved" "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz" - "version" "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== dependencies: "@jridgewell/trace-mapping" "^0.3.18" - "callsites" "^3.0.0" - "graceful-fs" "^4.2.9" + callsites "^3.0.0" + graceful-fs "^4.2.9" "@jest/test-result@^29.6.2": - "integrity" "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==" - "resolved" "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz" - "version" "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== dependencies: "@jest/console" "^29.6.2" "@jest/types" "^29.6.1" "@types/istanbul-lib-coverage" "^2.0.0" - "collect-v8-coverage" "^1.0.0" + collect-v8-coverage "^1.0.0" "@jest/test-sequencer@^29.6.2": - "integrity" "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==" - "resolved" "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz" - "version" "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== dependencies: "@jest/test-result" "^29.6.2" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^29.6.2" - "slash" "^3.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + slash "^3.0.0" "@jest/transform@^29.6.2": - "integrity" "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==" - "resolved" "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz" - "version" "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== dependencies: "@babel/core" "^7.11.6" "@jest/types" "^29.6.1" "@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" - "micromatch" "^4.0.4" - "pirates" "^4.0.4" - "slash" "^3.0.0" - "write-file-atomic" "^4.0.2" - -"@jest/types@^29.0.0", "@jest/types@^29.6.1": - "integrity" "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==" - "resolved" "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" - "version" "29.6.1" + 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" + 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== dependencies: "@jest/schemas" "^29.6.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" - "chalk" "^4.0.0" + chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - "integrity" "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - "version" "0.3.3" + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.1.0": - "integrity" "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - "version" "3.1.1" + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": - "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - "version" "1.4.15" + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + 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": - "integrity" "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" - "version" "0.3.19" + 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== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" +"@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" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@sinclair/typebox@^0.27.8": - "integrity" "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - "resolved" "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - "version" "0.27.8" + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": - "integrity" "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==" - "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" - "version" "3.0.0" + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: - "type-detect" "4.0.8" + type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": - "integrity" "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==" - "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" - "version" "10.3.0" + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@types/babel__core@^7.1.14": - "integrity" "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==" - "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" - "version" "7.20.1" + 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== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -645,159 +645,159 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - "integrity" "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==" - "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - "version" "7.6.4" + 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== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - "integrity" "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" - "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - "version" "7.4.1" + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - "integrity" "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==" - "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" - "version" "7.20.1" + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== dependencies: "@babel/types" "^7.20.7" "@types/graceful-fs@^4.1.3": - "integrity" "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==" - "resolved" "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" - "version" "4.1.6" + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - "integrity" "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - "version" "2.0.4" + 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== "@types/istanbul-lib-report@*": - "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - "version" "3.0.0" + 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== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" - "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - "version" "3.0.1" + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.4.0": - "integrity" "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==" - "resolved" "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz" - "version" "29.5.3" + version "29.5.3" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz" + integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== dependencies: - "expect" "^29.0.0" - "pretty-format" "^29.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@^7.0.9": - "integrity" "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" - "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" - "version" "7.0.12" + 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== "@types/node@*", "@types/node@^18.15.12": - "integrity" "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz" - "version" "18.17.5" + version "18.17.5" + resolved "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz" + integrity sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA== "@types/semver@^7.3.12": - "integrity" "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" - "version" "7.5.0" + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/stack-utils@^2.0.0": - "integrity" "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - "resolved" "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - "version" "2.0.1" + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/yargs-parser@*": - "integrity" "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - "version" "21.0.0" + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - "integrity" "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==" - "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" - "version" "17.0.24" + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.30.7": - "integrity" "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/type-utils" "5.62.0" "@typescript-eslint/utils" "5.62.0" - "debug" "^4.3.4" - "graphemer" "^1.4.0" - "ignore" "^5.2.0" - "natural-compare-lite" "^1.4.0" - "semver" "^7.3.7" - "tsutils" "^3.21.0" - -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.30.7": - "integrity" "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" - "version" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.30.7": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" - "debug" "^4.3.4" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": - "integrity" "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" "@typescript-eslint/type-utils@5.62.0": - "integrity" "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" "@typescript-eslint/utils" "5.62.0" - "debug" "^4.3.4" - "tsutils" "^3.21.0" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@5.62.0": - "integrity" "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.62.0": - "integrity" "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" - "debug" "^4.3.4" - "globby" "^11.1.0" - "is-glob" "^4.0.3" - "semver" "^7.3.7" - "tsutils" "^3.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" "@typescript-eslint/utils@5.62.0": - "integrity" "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" @@ -805,217 +805,217 @@ "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" - "eslint-scope" "^5.1.1" - "semver" "^7.3.7" + eslint-scope "^5.1.1" + semver "^7.3.7" "@typescript-eslint/visitor-keys@5.62.0": - "integrity" "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" - "eslint-visitor-keys" "^3.3.0" - -"abbrev@1": - "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - "version" "1.1.1" - -"acorn-jsx@^5.3.2": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.9.0": - "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - "version" "8.10.0" - -"after@~0.8.1": - "integrity" "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" - "resolved" "https://registry.npmjs.org/after/-/after-0.8.2.tgz" - "version" "0.8.2" - -"ajv@^6.12.3", "ajv@^6.12.4": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" - dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" - -"amdefine@>=0.0.4": - "integrity" "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" - "resolved" "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - "version" "1.0.1" - -"ansi-escapes@^4.2.1": - "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" - "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - "version" "4.3.2" - dependencies: - "type-fest" "^0.21.3" - -"ansi-regex@^2.0.0": - "integrity" "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - "version" "2.1.1" - -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" - -"ansi-sequence-parser@^1.1.0": - "integrity" "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" - "resolved" "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz" - "version" "1.1.1" - -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"ansi-styles@^5.0.0": - "integrity" "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - "version" "5.2.0" - -"ansi@^0.3.0", "ansi@~0.3.0", "ansi@~0.3.1": - "integrity" "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==" - "resolved" "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" - "version" "0.3.1" - -"anymatch@^3.0.3": - "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"aproba@^1.0.3": - "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" - "version" "1.2.0" - -"are-we-there-yet@~1.0.0": - "integrity" "sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ==" - "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "delegates" "^1.0.0" - "readable-stream" "^2.0.0 || ^1.1.13" - -"are-we-there-yet@~1.1.2": - "integrity" "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==" - "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" - "version" "1.1.7" - dependencies: - "delegates" "^1.0.0" - "readable-stream" "^2.0.6" - -"argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "sprintf-js" "~1.0.2" - -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" - -"array-index@^1.0.0": - "integrity" "sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw==" - "resolved" "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "debug" "^2.2.0" - "es6-symbol" "^3.0.2" - -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" - -"asn1@~0.2.3": - "integrity" "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==" - "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" - "version" "0.2.6" - dependencies: - "safer-buffer" "~2.1.0" - -"assert-plus@^1.0.0", "assert-plus@1.0.0": - "integrity" "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - "version" "1.0.0" - -"asynckit@^0.4.0": - "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" - -"aws-sign2@~0.7.0": - "integrity" "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - "version" "0.7.0" + eslint-visitor-keys "^3.3.0" + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +after@~0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/after/-/after-0.8.2.tgz" + integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== + +ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + 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" + integrity sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +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" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + 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" + 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" + integrity sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw== + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + 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" + 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" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + 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" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== -"aws4@^1.8.0": - "integrity" "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" - "version" "1.12.0" +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -"babel-jest@^29.0.0", "babel-jest@^29.6.2": - "integrity" "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==" - "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@jest/transform" "^29.6.2" "@types/babel__core" "^7.1.14" - "babel-plugin-istanbul" "^6.1.1" - "babel-preset-jest" "^29.5.0" - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "slash" "^3.0.0" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" -"babel-plugin-istanbul@^6.1.1": - "integrity" "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==" - "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - "version" "6.1.1" +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" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - "istanbul-lib-instrument" "^5.0.4" - "test-exclude" "^6.0.0" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" -"babel-plugin-jest-hoist@^29.5.0": - "integrity" "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==" - "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz" - "version" "29.5.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== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -"babel-preset-current-node-syntax@^1.0.0": - "integrity" "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==" - "resolved" "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - "version" "1.0.1" +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" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -1030,621 +1030,616 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -"babel-preset-jest@^29.5.0": - "integrity" "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==" - "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz" - "version" "29.5.0" +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== dependencies: - "babel-plugin-jest-hoist" "^29.5.0" - "babel-preset-current-node-syntax" "^1.0.0" + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -"base64-js@^1.3.1": - "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - "version" "1.5.1" +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -"bcrypt-pbkdf@^1.0.0": - "integrity" "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==" - "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "tweetnacl" "^0.14.3" +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" -"big-integer@^1.6.17": - "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - "version" "1.6.51" +big-integer@^1.6.17: + version "1.6.51" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -"binary@~0.3.0": - "integrity" "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" - "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "buffers" "~0.1.1" - "chainsaw" "~0.1.0" +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" -"bl@^4.0.3": - "integrity" "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" - "resolved" "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "buffer" "^5.5.0" - "inherits" "^2.0.4" - "readable-stream" "^3.4.0" - -"bl@~3.0.0": - "integrity" "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==" - "resolved" "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "readable-stream" "^3.0.1" - -"bluebird@^3": - "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - "version" "3.7.2" - -"bluebird@~3.4.1": - "integrity" "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" - "version" "3.4.7" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"brace-expansion@^2.0.1": - "integrity" "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "balanced-match" "^1.0.0" - -"braces@^3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"browserslist@^4.21.9", "browserslist@>= 4.21.0": - "integrity" "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" - "version" "4.21.10" - dependencies: - "caniuse-lite" "^1.0.30001517" - "electron-to-chromium" "^1.4.477" - "node-releases" "^2.0.13" - "update-browserslist-db" "^1.0.11" - -"bs-logger@0.x": - "integrity" "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==" - "resolved" "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" - "version" "0.2.6" - dependencies: - "fast-json-stable-stringify" "2.x" - -"bser@2.1.1": - "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" - "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "node-int64" "^0.4.0" - -"buffer-from@^0.1.1": - "integrity" "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz" - "version" "0.1.2" - -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" - -"buffer-indexof-polyfill@~1.0.0": - "integrity" "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" - "resolved" "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" - "version" "1.0.2" - -"buffer-shims@^1.0.0": - "integrity" "sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==" - "resolved" "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" - "version" "1.0.0" - -"buffer@^5.5.0": - "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" - "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - "version" "5.7.1" - dependencies: - "base64-js" "^1.3.1" - "ieee754" "^1.1.13" - -"buffers@~0.1.1": - "integrity" "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" - "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" - "version" "0.1.1" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camelcase@^2.0.1": - "integrity" "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" - "version" "2.1.1" - -"camelcase@^5.3.1": - "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - "version" "5.3.1" - -"camelcase@^6.2.0": - "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - "version" "6.3.0" - -"caniuse-lite@^1.0.30001517": - "integrity" "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz" - "version" "1.0.30001521" - -"cargo-cp-artifact@^0.1.6": - "integrity" "sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==" - "resolved" "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz" - "version" "0.1.8" - -"caseless@~0.12.0": - "integrity" "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - "version" "0.12.0" - -"chainsaw@~0.1.0": - "integrity" "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" - "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" - "version" "0.1.0" - dependencies: - "traverse" ">=0.3.0 <0.4" - -"chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^4.0.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"char-regex@^1.0.2": - "integrity" "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - "resolved" "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - "version" "1.0.2" - -"chownr@^1.1.1", "chownr@^1.1.4": - "integrity" "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - "resolved" "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - "version" "1.1.4" - -"ci-info@^3.2.0": - "integrity" "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - "version" "3.8.0" - -"cjs-module-lexer@^1.0.0": - "integrity" "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" - "resolved" "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" - "version" "1.2.3" - -"class-transformer@^0.5.1": - "integrity" "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - "resolved" "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" - "version" "0.5.1" - -"cliui@^3.0.3": - "integrity" "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" - "version" "3.2.0" - dependencies: - "string-width" "^1.0.1" - "strip-ansi" "^3.0.1" - "wrap-ansi" "^2.0.0" - -"cliui@^8.0.1": - "integrity" "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - "version" "8.0.1" - dependencies: - "string-width" "^4.2.0" - "strip-ansi" "^6.0.1" - "wrap-ansi" "^7.0.0" - -"cmake-js@~5.2.0": - "integrity" "sha512-/HLhzoBEOLKGdE1FLwH5ggzRt67AWTb4IErg4rm+bTC+R0DKUobojDyp17dSswDVPosdoPmHXjKxbJiyBZfQeg==" - "resolved" "https://registry.npmjs.org/cmake-js/-/cmake-js-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "bluebird" "^3" - "debug" "^4" - "fs-extra" "^5.0.0" - "is-iojs" "^1.0.1" - "lodash" "^4" - "memory-stream" "0" - "npmlog" "^1.2.0" - "rc" "^1.2.7" - "request" "^2.54.0" - "semver" "^5.0.3" - "splitargs" "0" - "tar" "^4" - "traceur" "0.0.x" - "unzipper" "^0.8.13" - "url-join" "0" - "which" "^1.0.9" - "yargs" "^3.6.0" - -"co@^4.6.0": - "integrity" "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" - "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - "version" "4.6.0" - -"code-point-at@^1.0.0": - "integrity" "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" - "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" - "version" "1.1.0" - -"collect-v8-coverage@^1.0.0": - "integrity" "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - "resolved" "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" - "version" "1.0.2" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"combined-stream@^1.0.6", "combined-stream@~1.0.6": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"commander@^2.9.0": - "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - "version" "2.20.3" - -"commander@2.9.x": - "integrity" "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" - "version" "2.9.0" - dependencies: - "graceful-readlink" ">= 1.0.0" - -"concat-map@0.0.1": - "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"console-control-strings@^1.0.0", "console-control-strings@~1.1.0": - "integrity" "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - "resolved" "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" - "version" "1.1.0" - -"convert-source-map@^1.6.0": - "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - "version" "1.9.0" - -"convert-source-map@^1.7.0": - "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - "version" "1.9.0" - -"convert-source-map@^2.0.0": - "integrity" "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - "version" "2.0.0" - -"core-util-is@~1.0.0", "core-util-is@1.0.2": - "integrity" "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - "version" "1.0.2" - -"cross-spawn@^7.0.2", "cross-spawn@^7.0.3": - "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - "version" "7.0.3" - dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" - -"d@^1.0.1", "d@1": - "integrity" "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==" - "resolved" "https://registry.npmjs.org/d/-/d-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "es5-ext" "^0.10.50" - "type" "^1.0.1" - -"dashdash@^1.12.0": - "integrity" "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==" - "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - "version" "1.14.1" - dependencies: - "assert-plus" "^1.0.0" - -"debug@^2.2.0": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^4", "debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" - dependencies: - "ms" "2.1.2" - -"decamelize@^1.1.1": - "integrity" "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - "version" "1.2.0" - -"decompress-response@^6.0.0": - "integrity" "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==" - "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "mimic-response" "^3.1.0" - -"dedent@^1.0.0": - "integrity" "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==" - "resolved" "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" - "version" "1.5.1" - -"deep-extend@^0.6.0": - "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - "version" "0.6.0" - -"deep-is@^0.1.3": - "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - "version" "0.1.4" - -"deepmerge@^4.2.2": - "integrity" "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - "version" "4.3.1" - -"delayed-stream@~1.0.0": - "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" - -"delegates@^1.0.0": - "integrity" "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - "version" "1.0.0" - -"detect-libc@^2.0.0": - "integrity" "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - "resolved" "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" - "version" "2.0.2" - -"detect-newline@^3.0.0": - "integrity" "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - "version" "3.1.0" - -"diff-sequences@^29.4.3": - "integrity" "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" - "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" - "version" "29.4.3" - -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "path-type" "^4.0.0" - -"doctrine@^3.0.0": - "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "esutils" "^2.0.2" - -"dotenv@^16.0.3": - "integrity" "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" - "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" - "version" "16.3.1" - -"duplexer2@~0.0.2": - "integrity" "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==" - "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" - "version" "0.0.2" - dependencies: - "readable-stream" "~1.1.9" - -"duplexer2@~0.1.4": - "integrity" "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" - "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "readable-stream" "^2.0.2" - -"each-series-async@^1.0.1": - "integrity" "sha512-G4zip/Ewpwr6JQxW7+2RNgkPd09h/UNec5UlvA/xKwl4qf5blyBNK6a/zjQc3MojgsxaOb93B9v3T92QU6IMVg==" - "resolved" "https://registry.npmjs.org/each-series-async/-/each-series-async-1.0.1.tgz" - "version" "1.0.1" - -"ecc-jsbn@~0.1.1": - "integrity" "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==" - "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - "version" "0.1.2" - dependencies: - "jsbn" "~0.1.0" - "safer-buffer" "^2.1.0" - -"electron-build-env@^0.2.0": - "integrity" "sha512-L431TbXtXe6iw3ko7ITr/qCu+jumVKLAhCDyhqfab6421LGlawVcT88Ws/DHR57+1lkLN1POQqwNOkjPwQJQmQ==" - "resolved" "https://registry.npmjs.org/electron-build-env/-/electron-build-env-0.2.0.tgz" - "version" "0.2.0" - dependencies: - "commander" "^2.9.0" - "mkdirp" "^0.5.1" - -"electron-to-chromium@^1.4.477": - "integrity" "sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz" - "version" "1.4.492" - -"emittery@^0.13.1": - "integrity" "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" - "resolved" "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" - "version" "0.13.1" - -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" - -"end-of-stream@^1.1.0", "end-of-stream@^1.4.1": - "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" - "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - "version" "1.4.4" - dependencies: - "once" "^1.4.0" - -"env-paths@^2.2.0": - "integrity" "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - "resolved" "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" - "version" "2.2.1" - -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "is-arrayish" "^0.2.1" - -"es5-ext@^0.10.35", "es5-ext@^0.10.50": - "integrity" "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==" - "resolved" "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" - "version" "0.10.62" - dependencies: - "es6-iterator" "^2.0.3" - "es6-symbol" "^3.1.3" - "next-tick" "^1.1.0" - -"es6-iterator@^2.0.3": - "integrity" "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==" - "resolved" "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" - "version" "2.0.3" - dependencies: - "d" "1" - "es5-ext" "^0.10.35" - "es6-symbol" "^3.1.1" - -"es6-symbol@^3.0.2", "es6-symbol@^3.1.1", "es6-symbol@^3.1.3": - "integrity" "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==" - "resolved" "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "d" "^1.0.1" - "ext" "^1.1.2" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-string-regexp@^1.0.5": - "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^2.0.0": - "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - "version" "2.0.0" - -"escape-string-regexp@^4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" - -"eslint-config-prettier@^8.5.0": - "integrity" "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==" - "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" - "version" "8.10.0" - -"eslint-scope@^5.1.1": - "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^4.1.1" - -"eslint-scope@^7.2.2": - "integrity" "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - "version" "7.2.2" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^5.2.0" - -"eslint-visitor-keys@^3.3.0", "eslint-visitor-keys@^3.4.1", "eslint-visitor-keys@^3.4.3": - "integrity" "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - "version" "3.4.3" - -"eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.20.0", "eslint@>=7.0.0": - "integrity" "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz" - "version" "8.47.0" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bl@~3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz" + 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" + 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" + 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" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + 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" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +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== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + 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" + 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" + 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" + 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" + 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" + integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + 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== + +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" + integrity sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + 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" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + 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" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +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== + +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" + 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" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +cmake-js@~5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/cmake-js/-/cmake-js-5.2.0.tgz" + integrity sha512-/HLhzoBEOLKGdE1FLwH5ggzRt67AWTb4IErg4rm+bTC+R0DKUobojDyp17dSswDVPosdoPmHXjKxbJiyBZfQeg== + dependencies: + bluebird "^3" + debug "^4" + fs-extra "^5.0.0" + is-iojs "^1.0.1" + lodash "^4" + memory-stream "0" + npmlog "^1.2.0" + rc "^1.2.7" + request "^2.54.0" + semver "^5.0.3" + splitargs "0" + tar "^4" + traceur "0.0.x" + unzipper "^0.8.13" + url-join "0" + which "^1.0.9" + yargs "^3.6.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +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" + 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" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.9.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + 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" + 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" + 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" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +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" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + 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" + 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" + 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" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" + 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" + 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" + 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" + 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" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + 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" + 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" + 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== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +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" + 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== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + 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" + 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" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +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" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +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" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + 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" + 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" + 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" + 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" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + 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== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" @@ -1653,948 +1648,924 @@ "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - "ajv" "^6.12.4" - "chalk" "^4.0.0" - "cross-spawn" "^7.0.2" - "debug" "^4.3.2" - "doctrine" "^3.0.0" - "escape-string-regexp" "^4.0.0" - "eslint-scope" "^7.2.2" - "eslint-visitor-keys" "^3.4.3" - "espree" "^9.6.1" - "esquery" "^1.4.2" - "esutils" "^2.0.2" - "fast-deep-equal" "^3.1.3" - "file-entry-cache" "^6.0.1" - "find-up" "^5.0.0" - "glob-parent" "^6.0.2" - "globals" "^13.19.0" - "graphemer" "^1.4.0" - "ignore" "^5.2.0" - "imurmurhash" "^0.1.4" - "is-glob" "^4.0.0" - "is-path-inside" "^3.0.3" - "js-yaml" "^4.1.0" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.4.1" - "lodash.merge" "^4.6.2" - "minimatch" "^3.1.2" - "natural-compare" "^1.4.0" - "optionator" "^0.9.3" - "strip-ansi" "^6.0.1" - "text-table" "^0.2.0" - -"espree@^9.6.0", "espree@^9.6.1": - "integrity" "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - "version" "9.6.1" - dependencies: - "acorn" "^8.9.0" - "acorn-jsx" "^5.3.2" - "eslint-visitor-keys" "^3.4.1" - -"esprima@^4.0.0": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" - -"esquery@^1.4.2": - "integrity" "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - "version" "1.5.0" - dependencies: - "estraverse" "^5.1.0" - -"esrecurse@^4.3.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "estraverse" "^5.2.0" - -"estraverse@^4.1.1": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" - -"estraverse@^5.1.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" - -"estraverse@^5.2.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" - -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"execa@^5.0.0": - "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" - "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "cross-spawn" "^7.0.3" - "get-stream" "^6.0.0" - "human-signals" "^2.1.0" - "is-stream" "^2.0.0" - "merge-stream" "^2.0.0" - "npm-run-path" "^4.0.1" - "onetime" "^5.1.2" - "signal-exit" "^3.0.3" - "strip-final-newline" "^2.0.0" - -"execspawn@^1.0.1": - "integrity" "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==" - "resolved" "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "util-extend" "^1.0.1" - -"exit@^0.1.2": - "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - "version" "0.1.2" - -"expand-template@^2.0.3": - "integrity" "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - "resolved" "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" - "version" "2.0.3" - -"expect@^29.0.0", "expect@^29.6.2": - "integrity" "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==" - "resolved" "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz" - "version" "29.6.2" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + 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" + 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" + 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" + 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" + 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" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execspawn@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz" + 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" + 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" + 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== 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" - -"ext@^1.1.2": - "integrity" "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==" - "resolved" "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" - "version" "1.7.0" - dependencies: - "type" "^2.7.2" - -"extend@~3.0.2": - "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - "version" "3.0.2" - -"extsprintf@^1.2.0", "extsprintf@1.3.0": - "integrity" "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - "version" "1.3.0" - -"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-glob@^3.2.9": - "integrity" "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" - "version" "3.3.1" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + 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" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +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" + 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" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.2" - "merge2" "^1.3.0" - "micromatch" "^4.0.4" - -"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@^2.1.0", "fast-json-stable-stringify@2.x": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" - -"fast-levenshtein@^2.0.6": - "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" - -"fastq@^1.6.0": - "integrity" "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - "version" "1.15.0" - dependencies: - "reusify" "^1.0.4" - -"fb-watchman@^2.0.0": - "integrity" "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==" - "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "bser" "2.1.1" - -"file-entry-cache@^6.0.1": - "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "flat-cache" "^3.0.4" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-up@^4.0.0": - "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "locate-path" "^5.0.0" - "path-exists" "^4.0.0" - -"find-up@^4.1.0": - "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "locate-path" "^5.0.0" - "path-exists" "^4.0.0" - -"find-up@^5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" - -"flat-cache@^3.0.4": - "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "flatted" "^3.1.0" - "rimraf" "^3.0.2" - -"flatted@^3.1.0": - "integrity" "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - "version" "3.2.7" - -"forever-agent@~0.6.1": - "integrity" "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - "version" "0.6.1" - -"form-data@~2.3.2": - "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - "version" "2.3.3" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.6" - "mime-types" "^2.1.12" - -"fs-constants@^1.0.0": - "integrity" "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - "resolved" "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" - "version" "1.0.0" - -"fs-extra@^5.0.0": - "integrity" "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "graceful-fs" "^4.1.2" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs-minipass@^1.2.7": - "integrity" "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==" - "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" - "version" "1.2.7" - dependencies: - "minipass" "^2.6.0" - -"fs.realpath@^1.0.0": - "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fsevents@^2.3.2": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" - -"fstream@^1.0.0", "fstream@~1.0.10": - "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" - "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" - "version" "1.0.12" - dependencies: - "graceful-fs" "^4.1.2" - "inherits" "~2.0.0" - "mkdirp" ">=0.5 0" - "rimraf" "2" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"gauge@~1.2.0": - "integrity" "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==" - "resolved" "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" - "version" "1.2.7" - dependencies: - "ansi" "^0.3.0" - "has-unicode" "^2.0.0" - "lodash.pad" "^4.1.0" - "lodash.padend" "^4.1.0" - "lodash.padstart" "^4.1.0" - -"gauge@~1.2.5": - "integrity" "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==" - "resolved" "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" - "version" "1.2.7" - dependencies: - "ansi" "^0.3.0" - "has-unicode" "^2.0.0" - "lodash.pad" "^4.1.0" - "lodash.padend" "^4.1.0" - "lodash.padstart" "^4.1.0" - -"gauge@~2.7.3": - "integrity" "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==" - "resolved" "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" - "version" "2.7.4" - dependencies: - "aproba" "^1.0.3" - "console-control-strings" "^1.0.0" - "has-unicode" "^2.0.0" - "object-assign" "^4.1.0" - "signal-exit" "^3.0.0" - "string-width" "^1.0.1" - "strip-ansi" "^3.0.1" - "wide-align" "^1.1.0" - -"gensync@^1.0.0-beta.2": - "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - "version" "1.0.0-beta.2" - -"get-caller-file@^2.0.5": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"get-package-type@^0.1.0": - "integrity" "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - "resolved" "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - "version" "0.1.0" - -"get-stream@^6.0.0": - "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - "version" "6.0.1" - -"getpass@^0.1.1": - "integrity" "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==" - "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - "version" "0.1.7" - dependencies: - "assert-plus" "^1.0.0" - -"ghreleases@^3.0.2": - "integrity" "sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw==" - "resolved" "https://registry.npmjs.org/ghreleases/-/ghreleases-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "after" "~0.8.1" - "ghrepos" "~2.1.0" - "ghutils" "~3.2.0" - "lodash.uniq" "^4.5.0" - "simple-mime" "~0.1.0" - "url-template" "~2.0.6" - -"ghrepos@~2.1.0": - "integrity" "sha512-6GM0ohSDTAv7xD6GsKfxJiV/CajoofRyUwu0E8l29d1o6lFAUxmmyMP/FH33afA20ZrXzxxcTtN6TsYvudMoAg==" - "resolved" "https://registry.npmjs.org/ghrepos/-/ghrepos-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "ghutils" "~3.2.0" - -"ghutils@~3.2.0": - "integrity" "sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg==" - "resolved" "https://registry.npmjs.org/ghutils/-/ghutils-3.2.6.tgz" - "version" "3.2.6" - dependencies: - "jsonist" "~2.1.0" - "xtend" "~4.0.1" - -"github-from-package@0.0.0": - "integrity" "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - "resolved" "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" - "version" "0.0.0" - -"glob-parent@^5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-parent@^6.0.2": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "is-glob" "^4.0.3" - -"glob@^7.0.3", "glob@^7.1.3", "glob@^7.1.4", "glob@^7.1.6", "glob@3 || 4 || 5 || 6 || 7": - "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - "version" "7.2.3" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.1.1" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"glob@5.0.x": - "integrity" "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" - "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - "version" "5.0.15" - dependencies: - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "2 || 3" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"globals@^11.1.0": - "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - "version" "11.12.0" - -"globals@^13.19.0": - "integrity" "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" - "version" "13.21.0" - dependencies: - "type-fest" "^0.20.2" - -"globby@^11.1.0": - "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - "version" "11.1.0" - dependencies: - "array-union" "^2.1.0" - "dir-glob" "^3.0.1" - "fast-glob" "^3.2.9" - "ignore" "^5.2.0" - "merge2" "^1.4.1" - "slash" "^3.0.0" - -"graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.2", "graceful-fs@^4.2.9": - "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - "version" "4.2.11" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +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" + 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" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + 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" + 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" + 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" + 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" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + 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== + dependencies: + flatted "^3.1.0" + 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== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + 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" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" + 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" + 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== + +fstream@^1.0.0, fstream@~1.0.10: + version "1.0.12" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + 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== + +gauge@~1.2.0, gauge@~1.2.5: + version "1.2.7" + resolved "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" + integrity sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA== + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw== + dependencies: + after "~0.8.1" + ghrepos "~2.1.0" + ghutils "~3.2.0" + lodash.uniq "^4.5.0" + simple-mime "~0.1.0" + url-template "~2.0.6" + +ghrepos@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/ghrepos/-/ghrepos-2.1.0.tgz" + 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" + integrity sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg== + dependencies: + jsonist "~2.1.0" + xtend "~4.0.1" + +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" + 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" + 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" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +"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" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@5.0.x: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + 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== + 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" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== "graceful-readlink@>= 1.0.0": - "integrity" "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" - "resolved" "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - "version" "1.0.1" - -"graphemer@^1.4.0": - "integrity" "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - "resolved" "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - "version" "1.4.0" - -"handlebars@^4.7.7": - "integrity" "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==" - "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" - "version" "4.7.8" - dependencies: - "minimist" "^1.2.5" - "neo-async" "^2.6.2" - "source-map" "^0.6.1" - "wordwrap" "^1.0.0" + version "1.0.1" + resolved "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: - "uglify-js" "^3.1.4" - -"har-schema@^2.0.0": - "integrity" "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" - "version" "2.0.0" - -"har-validator@~5.1.3": - "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" - "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" - "version" "5.1.5" - dependencies: - "ajv" "^6.12.3" - "har-schema" "^2.0.0" - -"has-flag@^3.0.0": - "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"has-unicode@^2.0.0": - "integrity" "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" - "version" "2.0.1" - -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "function-bind" "^1.1.1" - -"html-escaper@^2.0.0": - "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - "version" "2.0.2" - -"http-signature@~1.2.0": - "integrity" "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==" - "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "assert-plus" "^1.0.0" - "jsprim" "^1.2.2" - "sshpk" "^1.7.0" - -"human-signals@^2.1.0": - "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - "version" "2.1.0" - -"hyperquest@~2.1.3": - "integrity" "sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw==" - "resolved" "https://registry.npmjs.org/hyperquest/-/hyperquest-2.1.3.tgz" - "version" "2.1.3" - dependencies: - "buffer-from" "^0.1.1" - "duplexer2" "~0.0.2" - "through2" "~0.6.3" - -"ieee754@^1.1.13": - "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - "version" "1.2.1" - -"ignore@^5.2.0": - "integrity" "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - "version" "5.2.4" - -"import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"import-local@^3.0.2": - "integrity" "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==" - "resolved" "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "pkg-dir" "^4.2.0" - "resolve-cwd" "^3.0.0" - -"imurmurhash@^0.1.4": - "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" - -"inflight@^1.0.4": - "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.0", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"ini@~1.3.0": - "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - "version" "1.3.8" - -"invert-kv@^1.0.0": - "integrity" "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" - "resolved" "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - "version" "1.0.0" - -"is-arrayish@^0.2.1": - "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" - -"is-core-module@^2.13.0": - "integrity" "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" - "version" "2.13.0" - dependencies: - "has" "^1.0.3" - -"is-extglob@^2.1.1": - "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-fullwidth-code-point@^1.0.0": - "integrity" "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "number-is-nan" "^1.0.0" - -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" - -"is-generator-fn@^2.0.0": - "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - "version" "2.1.0" - -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-iojs@^1.0.1": - "integrity" "sha512-tLn1j3wYSL6DkvEI+V/j0pKohpa5jk+ER74v6S4SgCXnjS0WA+DoZbwZBrrhgwksMvtuwndyGeG5F8YMsoBzSA==" - "resolved" "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz" - "version" "1.1.0" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-path-inside@^3.0.3": - "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - "version" "3.0.3" - -"is-stream@^2.0.0": - "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - "version" "2.0.1" - -"is-typedarray@~1.0.0": - "integrity" "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - "version" "1.0.0" - -"isarray@~1.0.0": - "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isarray@0.0.1": - "integrity" "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - "version" "0.0.1" - -"isexe@^2.0.0": - "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"isstream@~0.1.2": - "integrity" "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - "version" "0.1.2" - -"istanbul-lib-coverage@^3.0.0", "istanbul-lib-coverage@^3.2.0": - "integrity" "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - "version" "3.2.0" - -"istanbul-lib-instrument@^5.0.4", "istanbul-lib-instrument@^5.1.0": - "integrity" "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==" - "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - "version" "5.2.1" + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + 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" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + 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" + 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" + 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== + dependencies: + function-bind "^1.1.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + 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" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + 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" + integrity sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw== + dependencies: + buffer-from "^0.1.1" + duplexer2 "~0.0.2" + through2 "~0.6.3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + 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" + 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" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +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" + 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" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + 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" + 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== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + 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" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + 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" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + 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" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - "istanbul-lib-coverage" "^3.2.0" - "semver" "^6.3.0" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" -"istanbul-lib-report@^3.0.0": - "integrity" "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" - "version" "3.0.1" +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" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: - "istanbul-lib-coverage" "^3.0.0" - "make-dir" "^4.0.0" - "supports-color" "^7.1.0" + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" -"istanbul-lib-source-maps@^4.0.0": - "integrity" "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - "version" "4.0.1" +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" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: - "debug" "^4.1.1" - "istanbul-lib-coverage" "^3.0.0" - "source-map" "^0.6.1" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -"istanbul-reports@^3.1.3": - "integrity" "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==" - "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" - "version" "3.1.6" +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: - "html-escaper" "^2.0.0" - "istanbul-lib-report" "^3.0.0" + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" -"jest-changed-files@^29.5.0": - "integrity" "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==" - "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz" - "version" "29.5.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== dependencies: - "execa" "^5.0.0" - "p-limit" "^3.1.0" + execa "^5.0.0" + p-limit "^3.1.0" -"jest-circus@^29.6.2": - "integrity" "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==" - "resolved" "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@jest/environment" "^29.6.2" "@jest/expect" "^29.6.2" "@jest/test-result" "^29.6.2" "@jest/types" "^29.6.1" "@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" - "p-limit" "^3.1.0" - "pretty-format" "^29.6.2" - "pure-rand" "^6.0.0" - "slash" "^3.0.0" - "stack-utils" "^2.0.3" - -"jest-cli@^29.6.2": - "integrity" "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==" - "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz" - "version" "29.6.2" + 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" + p-limit "^3.1.0" + pretty-format "^29.6.2" + 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== dependencies: "@jest/core" "^29.6.2" "@jest/test-result" "^29.6.2" "@jest/types" "^29.6.1" - "chalk" "^4.0.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" - "yargs" "^17.3.1" - -"jest-config@^29.6.2": - "integrity" "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==" - "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz" - "version" "29.6.2" + chalk "^4.0.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" + 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== dependencies: "@babel/core" "^7.11.6" "@jest/test-sequencer" "^29.6.2" "@jest/types" "^29.6.1" - "babel-jest" "^29.6.2" - "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" - "micromatch" "^4.0.4" - "parse-json" "^5.2.0" - "pretty-format" "^29.6.2" - "slash" "^3.0.0" - "strip-json-comments" "^3.1.1" - -"jest-diff@^29.6.2": - "integrity" "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==" - "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz" - "version" "29.6.2" - dependencies: - "chalk" "^4.0.0" - "diff-sequences" "^29.4.3" - "jest-get-type" "^29.4.3" - "pretty-format" "^29.6.2" - -"jest-docblock@^29.4.3": - "integrity" "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==" - "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz" - "version" "29.4.3" - dependencies: - "detect-newline" "^3.0.0" - -"jest-each@^29.6.2": - "integrity" "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==" - "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz" - "version" "29.6.2" + babel-jest "^29.6.2" + 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" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.2" + 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== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +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== + 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== dependencies: "@jest/types" "^29.6.1" - "chalk" "^4.0.0" - "jest-get-type" "^29.4.3" - "jest-util" "^29.6.2" - "pretty-format" "^29.6.2" + 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": - "integrity" "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==" - "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz" - "version" "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" "@types/node" "*" - "jest-mock" "^29.6.2" - "jest-util" "^29.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" -"jest-get-type@^29.4.3": - "integrity" "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" - "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" - "version" "29.4.3" +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-haste-map@^29.6.2": - "integrity" "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==" - "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@jest/types" "^29.6.1" "@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" - "micromatch" "^4.0.4" - "walker" "^1.0.8" + 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" + micromatch "^4.0.4" + walker "^1.0.8" optionalDependencies: - "fsevents" "^2.3.2" + fsevents "^2.3.2" -"jest-leak-detector@^29.6.2": - "integrity" "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==" - "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz" - "version" "29.6.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== dependencies: - "jest-get-type" "^29.4.3" - "pretty-format" "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" -"jest-matcher-utils@^29.5.0", "jest-matcher-utils@^29.6.2": - "integrity" "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==" - "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: - "chalk" "^4.0.0" - "jest-diff" "^29.6.2" - "jest-get-type" "^29.4.3" - "pretty-format" "^29.6.2" + chalk "^4.0.0" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" -"jest-message-util@^29.6.2": - "integrity" "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==" - "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^29.6.1" "@types/stack-utils" "^2.0.0" - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "micromatch" "^4.0.4" - "pretty-format" "^29.6.2" - "slash" "^3.0.0" - "stack-utils" "^2.0.3" - -"jest-mock@^29.6.2": - "integrity" "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==" - "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz" - "version" "29.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.2" + 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== dependencies: "@jest/types" "^29.6.1" "@types/node" "*" - "jest-util" "^29.6.2" - -"jest-pnp-resolver@^1.2.2": - "integrity" "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" - "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" - "version" "1.2.3" - -"jest-regex-util@^29.4.3": - "integrity" "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==" - "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" - "version" "29.4.3" - -"jest-resolve-dependencies@^29.6.2": - "integrity" "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==" - "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz" - "version" "29.6.2" - dependencies: - "jest-regex-util" "^29.4.3" - "jest-snapshot" "^29.6.2" - -"jest-resolve@*", "jest-resolve@^29.6.2": - "integrity" "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==" - "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz" - "version" "29.6.2" - dependencies: - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^29.6.2" - "jest-pnp-resolver" "^1.2.2" - "jest-util" "^29.6.2" - "jest-validate" "^29.6.2" - "resolve" "^1.20.0" - "resolve.exports" "^2.0.0" - "slash" "^3.0.0" - -"jest-runner@^29.6.2": - "integrity" "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==" - "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz" - "version" "29.6.2" + jest-util "^29.6.2" + +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" + 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-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== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.2" + +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== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + 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== dependencies: "@jest/console" "^29.6.2" "@jest/environment" "^29.6.2" @@ -2602,26 +2573,26 @@ "@jest/transform" "^29.6.2" "@jest/types" "^29.6.1" "@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" - "p-limit" "^3.1.0" - "source-map-support" "0.5.13" - -"jest-runtime@^29.6.2": - "integrity" "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==" - "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz" - "version" "29.6.2" + 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" + 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" @@ -2631,25 +2602,25 @@ "@jest/transform" "^29.6.2" "@jest/types" "^29.6.1" "@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" - "slash" "^3.0.0" - "strip-bom" "^4.0.0" - -"jest-snapshot@^29.6.2": - "integrity" "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==" - "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz" - "version" "29.6.2" + 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" + 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== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -2659,1805 +2630,1724 @@ "@jest/expect-utils" "^29.6.2" "@jest/transform" "^29.6.2" "@jest/types" "^29.6.1" - "babel-preset-current-node-syntax" "^1.0.0" - "chalk" "^4.0.0" - "expect" "^29.6.2" - "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" - "natural-compare" "^1.4.0" - "pretty-format" "^29.6.2" - "semver" "^7.5.3" - -"jest-util@^29.0.0", "jest-util@^29.6.2": - "integrity" "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==" - "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz" - "version" "29.6.2" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.2" + 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" + natural-compare "^1.4.0" + pretty-format "^29.6.2" + 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== dependencies: "@jest/types" "^29.6.1" "@types/node" "*" - "chalk" "^4.0.0" - "ci-info" "^3.2.0" - "graceful-fs" "^4.2.9" - "picomatch" "^2.2.3" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -"jest-validate@^29.6.2": - "integrity" "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==" - "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@jest/types" "^29.6.1" - "camelcase" "^6.2.0" - "chalk" "^4.0.0" - "jest-get-type" "^29.4.3" - "leven" "^3.1.0" - "pretty-format" "^29.6.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.6.2" -"jest-watcher@^29.6.2": - "integrity" "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==" - "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@jest/test-result" "^29.6.2" "@jest/types" "^29.6.1" "@types/node" "*" - "ansi-escapes" "^4.2.1" - "chalk" "^4.0.0" - "emittery" "^0.13.1" - "jest-util" "^29.6.2" - "string-length" "^4.0.1" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.2" + string-length "^4.0.1" -"jest-worker@^29.6.2": - "integrity" "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==" - "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz" - "version" "29.6.2" +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== dependencies: "@types/node" "*" - "jest-util" "^29.6.2" - "merge-stream" "^2.0.0" - "supports-color" "^8.0.0" + jest-util "^29.6.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" -"jest@^29.0.0", "jest@^29.4.2": - "integrity" "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==" - "resolved" "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz" - "version" "29.6.2" +jest@^29.4.2: + version "29.6.2" + resolved "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz" + integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== dependencies: "@jest/core" "^29.6.2" "@jest/types" "^29.6.1" - "import-local" "^3.0.2" - "jest-cli" "^29.6.2" - -"js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"js-yaml@^3.13.1": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"js-yaml@^4.1.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "argparse" "^2.0.1" - -"jsbn@~0.1.0": - "integrity" "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - "version" "0.1.1" - -"jsesc@^2.5.1": - "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - "version" "2.5.2" - -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" - -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" - -"json-schema@0.4.0": - "integrity" "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" - "version" "0.4.0" - -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" - -"json-stringify-safe@~5.0.1": - "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - "version" "5.0.1" - -"json5@^2.2.2", "json5@^2.2.3": - "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - "version" "2.2.3" - -"jsonc-parser@^3.2.0": - "integrity" "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - "resolved" "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" - "version" "3.2.0" - -"jsonfile@^4.0.0": - "integrity" "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - "version" "4.0.0" + import-local "^3.0.2" + jest-cli "^29.6.2" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + 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" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + 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" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + 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" + 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" + 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" + 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" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + 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" + 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" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: - "graceful-fs" "^4.1.6" - -"jsonist@~2.1.0": - "integrity" "sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ==" - "resolved" "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "bl" "~3.0.0" - "hyperquest" "~2.1.3" - "json-stringify-safe" "~5.0.1" - "xtend" "~4.0.1" - -"jsprim@^1.2.2": - "integrity" "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==" - "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" - "version" "1.4.2" - dependencies: - "assert-plus" "1.0.0" - "extsprintf" "1.3.0" - "json-schema" "0.4.0" - "verror" "1.10.0" - -"kleur@^3.0.3": - "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - "version" "3.0.3" - -"lcid@^1.0.0": - "integrity" "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==" - "resolved" "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "invert-kv" "^1.0.0" - -"leven@^3.1.0": - "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - "version" "3.1.0" - -"levn@^0.4.1": - "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - "version" "0.4.1" - dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" - -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" - -"listenercount@~1.0.1": - "integrity" "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" - "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" - "version" "1.0.1" - -"locate-path@^5.0.0": - "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "p-locate" "^4.1.0" - -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "p-locate" "^5.0.0" - -"lodash.memoize@4.x": - "integrity" "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - "version" "4.1.2" - -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" - -"lodash.pad@^4.1.0": - "integrity" "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==" - "resolved" "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz" - "version" "4.5.1" - -"lodash.padend@^4.1.0": - "integrity" "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==" - "resolved" "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz" - "version" "4.6.1" - -"lodash.padstart@^4.1.0": - "integrity" "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==" - "resolved" "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz" - "version" "4.6.1" - -"lodash.uniq@^4.5.0": - "integrity" "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - "version" "4.5.0" - -"lodash@^4": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"lru-cache@^5.1.1": - "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "yallist" "^3.0.2" - -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "yallist" "^4.0.0" - -"lunr@^2.3.9": - "integrity" "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - "resolved" "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" - "version" "2.3.9" - -"make-dir@^4.0.0": - "integrity" "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==" - "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "semver" "^7.5.3" - -"make-error@1.x": - "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - "version" "1.3.6" - -"makeerror@1.0.12": - "integrity" "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==" - "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - "version" "1.0.12" - dependencies: - "tmpl" "1.0.5" - -"marked@^4.3.0": - "integrity" "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - "resolved" "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" - "version" "4.3.0" - -"memory-stream@0": - "integrity" "sha512-q0D3m846qY6ZkIt+19ZemU5vH56lpOZZwoJc3AICARKh/menBuayQUjAGPrqtHQQMUYERSdOrej92J9kz7LgYA==" - "resolved" "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz" - "version" "0.0.3" - dependencies: - "readable-stream" "~1.0.26-2" - -"merge-stream@^2.0.0": - "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - "version" "2.0.0" - -"merge2@^1.3.0", "merge2@^1.4.1": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"micromatch@^4.0.4": - "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - "version" "4.0.5" - dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" - -"mime-db@1.52.0": - "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - "version" "1.52.0" - -"mime-types@^2.1.12", "mime-types@~2.1.19": - "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - "version" "2.1.35" - dependencies: - "mime-db" "1.52.0" - -"mimic-fn@^2.1.0": - "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - "version" "2.1.0" - -"mimic-response@^3.1.0": - "integrity" "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - "version" "3.1.0" - -"minimatch@^3.0.2", "minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.1", "minimatch@^3.1.2", "minimatch@2 || 3", "minimatch@3": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "brace-expansion" "^1.1.7" - -"minimatch@^9.0.0": - "integrity" "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - "version" "9.0.3" - 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": - "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - "version" "1.2.8" - -"minipass@^2.6.0", "minipass@^2.9.0": - "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==" - "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" - "version" "2.9.0" - dependencies: - "safe-buffer" "^5.1.2" - "yallist" "^3.0.0" - -"minizlib@^1.3.3": - "integrity" "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==" - "resolved" "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" - "version" "1.3.3" - dependencies: - "minipass" "^2.9.0" - -"mkdirp-classic@^0.5.2", "mkdirp-classic@^0.5.3": - "integrity" "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - "resolved" "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" - "version" "0.5.3" - -"mkdirp@^0.5.0", "mkdirp@^0.5.1", "mkdirp@^0.5.5", "mkdirp@>=0.5 0": - "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - "version" "0.5.6" - dependencies: - "minimist" "^1.2.6" - -"ms@2.0.0": - "integrity" "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - "version" "2.0.0" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"napi-build-utils@^1.0.1": - "integrity" "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - "resolved" "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" - "version" "1.0.2" - -"natural-compare-lite@^1.4.0": - "integrity" "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - "resolved" "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" - "version" "1.4.0" - -"natural-compare@^1.4.0": - "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" - -"neo-async@^2.6.2": - "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - "resolved" "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - "version" "2.6.2" - -"next-tick@^1.1.0": - "integrity" "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" - "version" "1.1.0" - -"node-abi@^3.0.0", "node-abi@^3.3.0": - "integrity" "sha512-LXvP3AqTIrtvH/jllXjkNVbYifpRbt9ThTtymSMSuHmhugQLAWr99QQFTm+ZRht9ziUvdGOgB+esme1C6iE6Lg==" - "resolved" "https://registry.npmjs.org/node-abi/-/node-abi-3.46.0.tgz" - "version" "3.46.0" - dependencies: - "semver" "^7.3.5" - -"node-gyp@^6.0.1": - "integrity" "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==" - "resolved" "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "env-paths" "^2.2.0" - "glob" "^7.1.4" - "graceful-fs" "^4.2.2" - "mkdirp" "^0.5.1" - "nopt" "^4.0.1" - "npmlog" "^4.1.2" - "request" "^2.88.0" - "rimraf" "^2.6.3" - "semver" "^5.7.1" - "tar" "^4.4.12" - "which" "^1.3.1" - -"node-int64@^0.4.0": - "integrity" "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - "version" "0.4.0" - -"node-ninja@^1.0.1": - "integrity" "sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw==" - "resolved" "https://registry.npmjs.org/node-ninja/-/node-ninja-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "fstream" "^1.0.0" - "glob" "3 || 4 || 5 || 6 || 7" - "graceful-fs" "^4.1.2" - "minimatch" "3" - "mkdirp" "^0.5.0" - "nopt" "2 || 3" - "npmlog" "0 || 1 || 2" - "osenv" "0" - "path-array" "^1.0.0" - "request" "2" - "rimraf" "2" - "semver" "2.x || 3.x || 4 || 5" - "tar" "^2.0.0" - "which" "1" - -"node-releases@^2.0.13": - "integrity" "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - "version" "2.0.13" - -"noop-logger@^0.1.0": - "integrity" "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==" - "resolved" "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz" - "version" "0.1.1" - -"nopt@^4.0.1": - "integrity" "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==" - "resolved" "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "abbrev" "1" - "osenv" "^0.1.4" + graceful-fs "^4.1.6" + +jsonist@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz" + integrity sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ== + dependencies: + bl "~3.0.0" + hyperquest "~2.1.3" + json-stringify-safe "~5.0.1" + xtend "~4.0.1" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + 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" + 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" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +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" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + 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" + 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" + 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" + 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" + 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" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + 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" + 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" + 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" + 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" + 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" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + 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" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +"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" + 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" + 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" + 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" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" + 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" + 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" + 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" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + 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" + 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" + 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" + 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" + 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" + 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== + 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" + integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + 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" + integrity sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw== + dependencies: + fstream "^1.0.0" + glob "3 || 4 || 5 || 6 || 7" + graceful-fs "^4.1.2" + minimatch "3" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + 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" + integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== "nopt@2 || 3": - "integrity" "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" - "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" - "version" "3.0.6" + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: - "abbrev" "1" - -"normalize-path@^3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" + abbrev "1" -"npm-path@^2.0.2": - "integrity" "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==" - "resolved" "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz" - "version" "2.0.4" +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: - "which" "^1.2.10" + abbrev "1" + osenv "^0.1.4" -"npm-run-path@^4.0.1": - "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" - "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "path-key" "^3.0.0" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -"npm-which@^3.0.1": - "integrity" "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A==" - "resolved" "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz" - "version" "3.0.1" +npm-path@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== dependencies: - "commander" "^2.9.0" - "npm-path" "^2.0.2" - "which" "^1.2.10" + which "^1.2.10" -"npmlog@^1.2.0": - "integrity" "sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ==" - "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" - "version" "1.2.1" +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" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - "ansi" "~0.3.0" - "are-we-there-yet" "~1.0.0" - "gauge" "~1.2.0" + path-key "^3.0.0" -"npmlog@^4.0.1", "npmlog@^4.1.2", "npmlog@0 || 1 || 2 || 3 || 4": - "integrity" "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==" - "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" - "version" "4.1.2" +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz" + integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== dependencies: - "are-we-there-yet" "~1.1.2" - "console-control-strings" "~1.1.0" - "gauge" "~2.7.3" - "set-blocking" "~2.0.0" + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" "npmlog@0 || 1 || 2": - "integrity" "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==" - "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "ansi" "~0.3.1" - "are-we-there-yet" "~1.1.2" - "gauge" "~1.2.5" - -"number-is-nan@^1.0.0": - "integrity" "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" - "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - "version" "1.0.1" - -"nw-gyp@^3.6.3": - "integrity" "sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA==" - "resolved" "https://registry.npmjs.org/nw-gyp/-/nw-gyp-3.6.6.tgz" - "version" "3.6.6" - dependencies: - "fstream" "^1.0.0" - "glob" "^7.0.3" - "graceful-fs" "^4.1.2" - "minimatch" "^3.0.2" - "mkdirp" "^0.5.0" - "nopt" "2 || 3" - "npmlog" "0 || 1 || 2 || 3 || 4" - "osenv" "0" - "request" "2" - "rimraf" "2" - "semver" "~5.3.0" - "tar" "^2.0.0" - "which" "1" - -"oauth-sign@~0.9.0": - "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" - "version" "0.9.0" - -"object-assign@^4.1.0": - "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" - -"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": - "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"onetime@^5.1.2": - "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" - "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "mimic-fn" "^2.1.0" - -"optionator@^0.9.3": - "integrity" "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" - "version" "0.9.3" + version "2.0.4" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz" + integrity sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ== + dependencies: + ansi "~0.3.1" + are-we-there-yet "~1.1.2" + gauge "~1.2.5" + +"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" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" + integrity sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ== + dependencies: + ansi "~0.3.0" + are-we-there-yet "~1.0.0" + gauge "~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" + 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" + integrity sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + 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" + 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" + 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" + 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" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" - "deep-is" "^0.1.3" - "fast-levenshtein" "^2.0.6" - "levn" "^0.4.1" - "prelude-ls" "^1.2.1" - "type-check" "^0.4.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" -"os-homedir@^1.0.0": - "integrity" "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" - "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - "version" "1.0.2" +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== -"os-locale@^1.4.0": - "integrity" "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==" - "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" - "version" "1.4.0" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== dependencies: - "lcid" "^1.0.0" + lcid "^1.0.0" -"os-tmpdir@^1.0.0": - "integrity" "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - "version" "1.0.2" +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -"osenv@^0.1.4", "osenv@0": - "integrity" "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==" - "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" - "version" "0.1.5" +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: - "os-homedir" "^1.0.0" - "os-tmpdir" "^1.0.0" + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" -"p-limit@^2.2.0": - "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - "version" "2.3.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: - "p-try" "^2.0.0" + p-try "^2.0.0" -"p-limit@^3.0.2", "p-limit@^3.1.0": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.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" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - "yocto-queue" "^0.1.0" + yocto-queue "^0.1.0" -"p-locate@^4.1.0": - "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - "version" "4.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: - "p-limit" "^2.2.0" + p-limit "^2.2.0" -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - "p-limit" "^3.0.2" + p-limit "^3.0.2" -"p-try@^2.0.0": - "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - "version" "2.2.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - "callsites" "^3.0.0" + callsites "^3.0.0" -"parse-json@^5.2.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" - -"path-array@^1.0.0": - "integrity" "sha512-teWG2rJTJJZi2kINKOsHcdIuHP7jy3D7pAsVgdhxMq8kaL2RnS5sg7YTlrClMVCIItcVbPTPI6eMBEoNxYahLA==" - "resolved" "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "array-index" "^1.0.0" - -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-key@^3.0.0", "path-key@^3.1.0": - "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - "version" "3.1.1" - -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"performance-now@^2.1.0": - "integrity" "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - "version" "2.1.0" - -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" - -"picomatch@^2.0.4", "picomatch@^2.2.3", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"pirates@^4.0.4": - "integrity" "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" - "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" - "version" "4.0.6" - -"pkg-dir@^4.2.0": - "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" - "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "find-up" "^4.0.0" - -"prebuild-install@^7.1.1": - "integrity" "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==" - "resolved" "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" - "version" "7.1.1" - dependencies: - "detect-libc" "^2.0.0" - "expand-template" "^2.0.3" - "github-from-package" "0.0.0" - "minimist" "^1.2.3" - "mkdirp-classic" "^0.5.3" - "napi-build-utils" "^1.0.1" - "node-abi" "^3.3.0" - "pump" "^3.0.0" - "rc" "^1.2.7" - "simple-get" "^4.0.0" - "tar-fs" "^2.0.0" - "tunnel-agent" "^0.6.0" - -"prebuild@^11.0.4": - "integrity" "sha512-n23Rzql2m8ldFpwcFyouGUrg9VByEF2IroEZlNvPLiQwTJWucTNxIaZEoyVe2AxPRzQb6Eph2ytObxVWm4FA7Q==" - "resolved" "https://registry.npmjs.org/prebuild/-/prebuild-11.0.4.tgz" - "version" "11.0.4" - dependencies: - "cmake-js" "~5.2.0" - "detect-libc" "^2.0.0" - "each-series-async" "^1.0.1" - "execspawn" "^1.0.1" - "ghreleases" "^3.0.2" - "github-from-package" "0.0.0" - "glob" "^7.1.6" - "minimist" "^1.1.2" - "mkdirp" "^0.5.1" - "napi-build-utils" "^1.0.1" - "node-abi" "^3.0.0" - "node-gyp" "^6.0.1" - "node-ninja" "^1.0.1" - "noop-logger" "^0.1.0" - "npm-which" "^3.0.1" - "npmlog" "^4.0.1" - "nw-gyp" "^3.6.3" - "rc" "^1.0.3" - "run-waterfall" "^1.1.6" - "tar-stream" "^2.1.0" - -"prelude-ls@^1.2.1": - "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - "version" "1.2.1" - -"prettier@^2.8.3": - "integrity" "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - "version" "2.8.8" - -"pretty-format@^29.0.0", "pretty-format@^29.6.2": - "integrity" "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz" - "version" "29.6.2" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + 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" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + 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" + 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" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prebuild@^11.0.4: + version "11.0.4" + resolved "https://registry.npmjs.org/prebuild/-/prebuild-11.0.4.tgz" + integrity sha512-n23Rzql2m8ldFpwcFyouGUrg9VByEF2IroEZlNvPLiQwTJWucTNxIaZEoyVe2AxPRzQb6Eph2ytObxVWm4FA7Q== + dependencies: + cmake-js "~5.2.0" + detect-libc "^2.0.0" + each-series-async "^1.0.1" + execspawn "^1.0.1" + ghreleases "^3.0.2" + github-from-package "0.0.0" + glob "^7.1.6" + minimist "^1.1.2" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^3.0.0" + node-gyp "^6.0.1" + node-ninja "^1.0.1" + noop-logger "^0.1.0" + npm-which "^3.0.1" + npmlog "^4.0.1" + nw-gyp "^3.6.3" + rc "^1.0.3" + run-waterfall "^1.1.6" + tar-stream "^2.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + 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== dependencies: "@jest/schemas" "^29.6.0" - "ansi-styles" "^5.0.0" - "react-is" "^18.0.0" - -"process-nextick-args@~1.0.6": - "integrity" "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" - "version" "1.0.7" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"prompts@^2.0.1": - "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" - "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "kleur" "^3.0.3" - "sisteransi" "^1.0.5" - -"psl@^1.1.28": - "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - "resolved" "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - "version" "1.9.0" - -"pump@^3.0.0": - "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" - "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "end-of-stream" "^1.1.0" - "once" "^1.3.1" - -"punycode@^2.1.0", "punycode@^2.1.1": - "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - "version" "2.3.0" - -"pure-rand@^6.0.0": - "integrity" "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==" - "resolved" "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz" - "version" "6.0.2" - -"qs@~6.5.2": - "integrity" "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" - "version" "6.5.3" - -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" - -"rc@^1.0.3", "rc@^1.2.7": - "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==" - "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - "version" "1.2.8" - dependencies: - "deep-extend" "^0.6.0" - "ini" "~1.3.0" - "minimist" "^1.2.0" - "strip-json-comments" "~2.0.1" - -"react-is@^18.0.0": - "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - "version" "18.2.0" - -"readable-stream@^2.0.0 || ^1.1.13": - "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - "version" "2.3.8" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readable-stream@^2.0.2", "readable-stream@~2.1.5": - "integrity" "sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" - "version" "2.1.5" - 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@^2.0.6": - "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - "version" "2.3.8" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readable-stream@^3.0.1", "readable-stream@^3.1.1", "readable-stream@^3.4.0": - "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - "version" "3.6.2" - dependencies: - "inherits" "^2.0.3" - "string_decoder" "^1.1.1" - "util-deprecate" "^1.0.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - "integrity" "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - "version" "1.0.34" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.1" - "isarray" "0.0.1" - "string_decoder" "~0.10.x" - -"readable-stream@~1.0.26-2": - "integrity" "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - "version" "1.0.34" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.1" - "isarray" "0.0.1" - "string_decoder" "~0.10.x" - -"readable-stream@~1.1.9": - "integrity" "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" - "version" "1.1.14" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.1" - "isarray" "0.0.1" - "string_decoder" "~0.10.x" - -"reflect-metadata@^0.1.13": - "integrity" "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - "resolved" "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" - "version" "0.1.13" - -"request@^2.54.0", "request@^2.88.0", "request@2": - "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" - "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz" - "version" "2.88.2" - dependencies: - "aws-sign2" "~0.7.0" - "aws4" "^1.8.0" - "caseless" "~0.12.0" - "combined-stream" "~1.0.6" - "extend" "~3.0.2" - "forever-agent" "~0.6.1" - "form-data" "~2.3.2" - "har-validator" "~5.1.3" - "http-signature" "~1.2.0" - "is-typedarray" "~1.0.0" - "isstream" "~0.1.2" - "json-stringify-safe" "~5.0.1" - "mime-types" "~2.1.19" - "oauth-sign" "~0.9.0" - "performance-now" "^2.1.0" - "qs" "~6.5.2" - "safe-buffer" "^5.1.2" - "tough-cookie" "~2.5.0" - "tunnel-agent" "^0.6.0" - "uuid" "^3.3.2" - -"require-directory@^2.1.1": - "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"resolve-cwd@^3.0.0": - "integrity" "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==" - "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "resolve-from" "^5.0.0" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"resolve-from@^5.0.0": - "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - "version" "5.0.0" - -"resolve.exports@^2.0.0": - "integrity" "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==" - "resolved" "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" - "version" "2.0.2" - -"resolve@^1.20.0": - "integrity" "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" - "version" "1.22.4" - dependencies: - "is-core-module" "^2.13.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"rimraf@^2.6.3": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"rimraf@^3.0.2": - "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "glob" "^7.1.3" - -"rimraf@2": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"rsvp@^3.0.13": - "integrity" "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" - "resolved" "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz" - "version" "3.6.2" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"run-waterfall@^1.1.6": - "integrity" "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==" - "resolved" "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz" - "version" "1.1.7" - -"safe-buffer@^5.0.1", "safe-buffer@^5.1.2", "safe-buffer@^5.2.1", "safe-buffer@~5.2.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@~2.1.0": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"semver@^4.3.3": - "integrity" "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" - "version" "4.3.6" - -"semver@^5.0.3": - "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - "version" "5.7.2" - -"semver@^5.7.1": - "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - "version" "5.7.2" - -"semver@^6.3.0": - "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - "version" "6.3.1" - -"semver@^6.3.1": - "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - "version" "6.3.1" - -"semver@^7.3.5", "semver@^7.3.7", "semver@^7.5.3": - "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - "version" "7.5.4" - dependencies: - "lru-cache" "^6.0.0" - -"semver@~5.3.0": - "integrity" "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" - "version" "5.3.0" - -"semver@2.x || 3.x || 4 || 5": - "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - "version" "5.7.2" - -"set-blocking@~2.0.0": - "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - "version" "2.0.0" - -"setimmediate@~1.0.4": - "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - "version" "1.0.5" - -"shebang-command@^2.0.0": - "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "shebang-regex" "^3.0.0" - -"shebang-regex@^3.0.0": - "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - "version" "3.0.0" - -"shiki@^0.14.1": - "integrity" "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==" - "resolved" "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz" - "version" "0.14.3" - dependencies: - "ansi-sequence-parser" "^1.1.0" - "jsonc-parser" "^3.2.0" - "vscode-oniguruma" "^1.7.0" - "vscode-textmate" "^8.0.0" - -"signal-exit@^3.0.0", "signal-exit@^3.0.3", "signal-exit@^3.0.7": - "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - "version" "3.0.7" - -"simple-concat@^1.0.0": - "integrity" "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - "resolved" "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" - "version" "1.0.1" - -"simple-get@^4.0.0": - "integrity" "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==" - "resolved" "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "decompress-response" "^6.0.0" - "once" "^1.3.1" - "simple-concat" "^1.0.0" - -"simple-mime@~0.1.0": - "integrity" "sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ==" - "resolved" "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz" - "version" "0.1.0" - -"sisteransi@^1.0.5": - "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - "version" "1.0.5" - -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" - -"source-map-support@~0.2.8": - "integrity" "sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz" - "version" "0.2.10" - dependencies: - "source-map" "0.1.32" - -"source-map-support@0.5.13": - "integrity" "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - "version" "0.5.13" - dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" - -"source-map@^0.6.0", "source-map@^0.6.1": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" - -"source-map@0.1.32": - "integrity" "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" - "version" "0.1.32" - dependencies: - "amdefine" ">=0.0.4" - -"splitargs@0": - "integrity" "sha512-UUFYD2oWbNwULH6WoVtLUOw8ch586B+HUqcsAjjjeoBQAM1bD4wZRXu01koaxyd8UeYpybWqW4h+lO1Okv40Tg==" - "resolved" "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz" - "version" "0.0.7" - -"sprintf-js@~1.0.2": - "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" - -"sshpk@^1.7.0": - "integrity" "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==" - "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - "version" "1.17.0" - dependencies: - "asn1" "~0.2.3" - "assert-plus" "^1.0.0" - "bcrypt-pbkdf" "^1.0.0" - "dashdash" "^1.12.0" - "ecc-jsbn" "~0.1.1" - "getpass" "^0.1.1" - "jsbn" "~0.1.0" - "safer-buffer" "^2.0.2" - "tweetnacl" "~0.14.0" - -"stack-utils@^2.0.3": - "integrity" "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==" - "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" - "version" "2.0.6" - dependencies: - "escape-string-regexp" "^2.0.0" - -"string_decoder@^1.1.1": - "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "safe-buffer" "~5.2.0" - -"string_decoder@~0.10.x": - "integrity" "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - "version" "0.10.31" - -"string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "safe-buffer" "~5.1.0" - -"string-length@^4.0.1": - "integrity" "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==" - "resolved" "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "char-regex" "^1.0.2" - "strip-ansi" "^6.0.0" - -"string-width@^1.0.1", "string-width@^1.0.2 || 2 || 3 || 4": - "integrity" "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "code-point-at" "^1.0.0" - "is-fullwidth-code-point" "^1.0.0" - "strip-ansi" "^3.0.0" - -"string-width@^4.1.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"string-width@^4.2.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"string-width@^4.2.3": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"strip-ansi@^3.0.0": - "integrity" "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "ansi-regex" "^2.0.0" - -"strip-ansi@^3.0.1": - "integrity" "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "ansi-regex" "^2.0.0" - -"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "ansi-regex" "^5.0.1" - -"strip-bom@^4.0.0": - "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - "version" "4.0.0" - -"strip-final-newline@^2.0.0": - "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - "version" "2.0.0" - -"strip-json-comments@^3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" - -"strip-json-comments@~2.0.1": - "integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - "version" "2.0.1" - -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" - -"supports-color@^8.0.0": - "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - "version" "8.1.1" - dependencies: - "has-flag" "^4.0.0" - -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.0.0" - -"tar-fs@^2.0.0": - "integrity" "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==" - "resolved" "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "chownr" "^1.1.1" - "mkdirp-classic" "^0.5.2" - "pump" "^3.0.0" - "tar-stream" "^2.1.4" - -"tar-stream@^2.1.0", "tar-stream@^2.1.4": - "integrity" "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" - "resolved" "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" - "version" "2.2.0" - dependencies: - "bl" "^4.0.3" - "end-of-stream" "^1.4.1" - "fs-constants" "^1.0.0" - "inherits" "^2.0.3" - "readable-stream" "^3.1.1" - -"tar@^4.4.19": - "integrity" "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==" - "resolved" "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" - "version" "4.4.19" - dependencies: - "chownr" "^1.1.4" - "fs-minipass" "^1.2.7" - "minipass" "^2.9.0" - "minizlib" "^1.3.3" - "mkdirp" "^0.5.5" - "safe-buffer" "^5.2.1" - "yallist" "^3.1.1" - -"test-exclude@^6.0.0": - "integrity" "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==" - "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - "version" "6.0.0" + 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" + 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" + 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" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + 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== + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +rc@^1.0.3, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + 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" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + 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" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + 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" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + 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" + 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" + 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" + 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== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + 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" + 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" + 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" + 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" + 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" + integrity sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ== + +safe-buffer@^5.0.1, 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" + 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" + 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" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"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: + 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== + dependencies: + lru-cache "^6.0.0" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + 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" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + 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" + 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== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + +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" + 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" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.8.2, simple-get@^4.0.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-mime@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz" + 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" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + 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" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +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" + integrity sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ== + dependencies: + source-map "0.1.32" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" + 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" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +splitargs@0: + version "0.0.7" + resolved "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz" + 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" + 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== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + 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" + 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": + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + 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: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +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" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +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" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" - "glob" "^7.1.4" - "minimatch" "^3.0.4" - -"text-table@^0.2.0": - "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" - -"through2@~0.6.3": - "integrity" "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==" - "resolved" "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz" - "version" "0.6.5" - dependencies: - "readable-stream" ">=1.0.33-1 <1.1.0-0" - "xtend" ">=4.0.0 <4.1.0-0" - -"tmpl@1.0.5": - "integrity" "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - "version" "1.0.5" - -"to-fast-properties@^2.0.0": - "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"tough-cookie@~2.5.0": - "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" - "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "psl" "^1.1.28" - "punycode" "^2.1.1" - -"traceur@0.0.x": - "integrity" "sha512-Zy0NCrl3+k1VZvDrZGQJHjLM4Hwz7XHSedhVTdsbV3RNWVtgw/GUP44Rl5WqqcctLkzyQ60eTU2jxfLrlrjWZQ==" - "resolved" "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz" - "version" "0.0.111" - dependencies: - "commander" "2.9.x" - "glob" "5.0.x" - "rsvp" "^3.0.13" - "semver" "^4.3.3" - "source-map-support" "~0.2.8" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + 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" + integrity sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg== + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + 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" + 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" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.3, tough-cookie@~2.5.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +traceur@0.0.x: + version "0.0.111" + resolved "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz" + integrity sha512-Zy0NCrl3+k1VZvDrZGQJHjLM4Hwz7XHSedhVTdsbV3RNWVtgw/GUP44Rl5WqqcctLkzyQ60eTU2jxfLrlrjWZQ== + dependencies: + commander "2.9.x" + glob "5.0.x" + rsvp "^3.0.13" + semver "^4.3.3" + source-map-support "~0.2.8" "traverse@>=0.3.0 <0.4": - "integrity" "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" - "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" - "version" "0.3.9" - -"ts-jest@^29.0.5": - "integrity" "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==" - "resolved" "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" - "version" "29.1.1" - dependencies: - "bs-logger" "0.x" - "fast-json-stable-stringify" "2.x" - "jest-util" "^29.0.0" - "json5" "^2.2.3" - "lodash.memoize" "4.x" - "make-error" "1.x" - "semver" "^7.5.3" - "yargs-parser" "^21.0.1" - -"tslib@^1.8.1": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"tsutils@^3.21.0": - "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" - "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - "version" "3.21.0" - dependencies: - "tslib" "^1.8.1" - -"tunnel-agent@^0.6.0": - "integrity" "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==" - "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - "version" "0.6.0" - dependencies: - "safe-buffer" "^5.0.1" - -"tweetnacl@^0.14.3", "tweetnacl@~0.14.0": - "integrity" "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - "version" "0.14.5" - -"type-check@^0.4.0", "type-check@~0.4.0": - "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - "version" "0.4.0" - dependencies: - "prelude-ls" "^1.2.1" - -"type-detect@4.0.8": - "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - "version" "4.0.8" - -"type-fest@^0.20.2": - "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - "version" "0.20.2" - -"type-fest@^0.21.3": - "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - "version" "0.21.3" - -"type@^1.0.1": - "integrity" "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - "resolved" "https://registry.npmjs.org/type/-/type-1.2.0.tgz" - "version" "1.2.0" - -"type@^2.7.2": - "integrity" "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - "resolved" "https://registry.npmjs.org/type/-/type-2.7.2.tgz" - "version" "2.7.2" - -"typedoc-plugin-markdown@^3.14.0": - "integrity" "sha512-KpjFL/NDrQAbY147oIoOgob2vAdEchsMcTVd6+e6H2lC1l5xhi48bhP/fMJI7qYQ8th5nubervgqw51z7gY66A==" - "resolved" "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.4.tgz" - "version" "3.15.4" - dependencies: - "handlebars" "^4.7.7" - -"typedoc@^0.24.6", "typedoc@>=0.24.0": - "integrity" "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==" - "resolved" "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz" - "version" "0.24.8" - dependencies: - "lunr" "^2.3.9" - "marked" "^4.3.0" - "minimatch" "^9.0.0" - "shiki" "^0.14.1" - -"typescript@^4.9.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=4.3 <6", "typescript@4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x": - "integrity" "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" - "version" "4.9.5" - -"uglify-js@^3.1.4": - "integrity" "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==" - "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" - "version" "3.17.4" - -"universalify@^0.1.0": - "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - "version" "0.1.2" - -"unzipper@^0.8.13": - "integrity" "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==" - "resolved" "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz" - "version" "0.8.14" - dependencies: - "big-integer" "^1.6.17" - "binary" "~0.3.0" - "bluebird" "~3.4.1" - "buffer-indexof-polyfill" "~1.0.0" - "duplexer2" "~0.1.4" - "fstream" "~1.0.10" - "listenercount" "~1.0.1" - "readable-stream" "~2.1.5" - "setimmediate" "~1.0.4" - -"update-browserslist-db@^1.0.11": - "integrity" "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==" - "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - "version" "1.0.11" - dependencies: - "escalade" "^3.1.1" - "picocolors" "^1.0.0" - -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"url-join@0": - "integrity" "sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==" - "resolved" "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz" - "version" "0.0.1" - -"url-template@~2.0.6": - "integrity" "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" - "resolved" "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" - "version" "2.0.8" - -"util-deprecate@^1.0.1", "util-deprecate@~1.0.1": - "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"util-extend@^1.0.1": - "integrity" "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" - "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" - "version" "1.0.3" - -"uuid@^3.3.2": - "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - "version" "3.4.0" - -"v8-to-istanbul@^9.0.1": - "integrity" "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==" - "resolved" "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" - "version" "9.1.0" + version "0.3.9" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + 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" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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== + dependencies: + handlebars "^4.7.7" + +typedoc@^0.24.6: + version "0.24.8" + resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz" + integrity sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.0" + shiki "^0.14.1" + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + 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" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unzipper@^0.8.13: + version "0.8.14" + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz" + integrity sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "~1.0.10" + listenercount "~1.0.1" + 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== + 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" + 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" + integrity sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url-template@~2.0.6: + version "2.0.8" + resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" + 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" + 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" + 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" + 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== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - "convert-source-map" "^1.6.0" - -"verror@1.10.0": - "integrity" "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==" - "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - "version" "1.10.0" - dependencies: - "assert-plus" "^1.0.0" - "core-util-is" "1.0.2" - "extsprintf" "^1.2.0" - -"vscode-oniguruma@^1.7.0": - "integrity" "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - "resolved" "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" - "version" "1.7.0" - -"vscode-textmate@^8.0.0": - "integrity" "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - "resolved" "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" - "version" "8.0.0" - -"walker@^1.0.8": - "integrity" "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==" - "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "makeerror" "1.0.12" - -"which@^1.0.9": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"which@^1.2.10": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"which@^1.3.1": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"which@^2.0.1": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "isexe" "^2.0.0" - -"which@1": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"wide-align@^1.1.0": - "integrity" "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==" - "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" - "version" "1.1.5" - dependencies: - "string-width" "^1.0.2 || 2 || 3 || 4" - -"window-size@^0.1.4": - "integrity" "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" - "resolved" "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" - "version" "0.1.4" - -"wordwrap@^1.0.0": - "integrity" "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - "version" "1.0.0" - -"wrap-ansi@^2.0.0": - "integrity" "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "string-width" "^1.0.1" - "strip-ansi" "^3.0.1" - -"wrap-ansi@^7.0.0": - "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" - -"wrappy@1": - "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"write-file-atomic@^4.0.2": - "integrity" "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "imurmurhash" "^0.1.4" - "signal-exit" "^3.0.7" - -"xtend@>=4.0.0 <4.1.0-0", "xtend@~4.0.1": - "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - "version" "4.0.2" - -"y18n@^3.2.0": - "integrity" "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" - "version" "3.2.2" - -"y18n@^5.0.5": - "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - "version" "5.0.8" - -"yallist@^3.0.0", "yallist@^3.0.2", "yallist@^3.1.1": - "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - "version" "3.1.1" - -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" - -"yargs-parser@^21.0.1", "yargs-parser@^21.1.1": - "integrity" "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - "version" "21.1.1" - -"yargs@^17.3.1": - "integrity" "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - "version" "17.7.2" - dependencies: - "cliui" "^8.0.1" - "escalade" "^3.1.1" - "get-caller-file" "^2.0.5" - "require-directory" "^2.1.1" - "string-width" "^4.2.3" - "y18n" "^5.0.5" - "yargs-parser" "^21.1.1" - -"yargs@^3.6.0": - "integrity" "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz" - "version" "3.32.0" - dependencies: - "camelcase" "^2.0.1" - "cliui" "^3.0.3" - "decamelize" "^1.1.1" - "os-locale" "^1.4.0" - "string-width" "^1.0.1" - "window-size" "^0.1.4" - "y18n" "^3.2.0" - -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" + convert-source-map "^1.6.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" + 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" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +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" + 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" + 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" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" + integrity sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw== + +word-wrap@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + 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" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + 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" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +"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" + 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" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + 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" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + 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" + 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" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^3.6.0: + version "3.32.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz" + integrity sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg== + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From f266883e3ef52947016f3e1654442203157ba738 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:25:51 +0200 Subject: [PATCH 26/56] Some Python fixes --- .../{build_alias.py => build_account.py} | 2 -- bindings/python/iota_sdk/client/client.py | 4 ---- bindings/python/iota_sdk/types/output.py | 6 ------ bindings/python/iota_sdk/types/send_params.py | 2 -- bindings/python/tests/test_output.py | 18 ++---------------- 5 files changed, 2 insertions(+), 30 deletions(-) rename bindings/python/examples/client/{build_alias.py => build_account.py} (93%) diff --git a/bindings/python/examples/client/build_alias.py b/bindings/python/examples/client/build_account.py similarity index 93% rename from bindings/python/examples/client/build_alias.py rename to bindings/python/examples/client/build_account.py index 540c1d210f..95efa4f88d 100644 --- a/bindings/python/examples/client/build_alias.py +++ b/bindings/python/examples/client/build_account.py @@ -19,7 +19,6 @@ 'rms1qpllaj0pyveqfkwxmnngz2c488hfdtmfrj3wfkgxtk4gtyrax0jaxzt70zy') account_id = '0x0000000000000000000000000000000000000000000000000000000000000000' -state_metadata = data = utf8_to_hex('Hello, World!') unlock_conditions = [ AddressUnlockCondition(Ed25519Address(hexAddress)), ] @@ -35,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/iota_sdk/client/client.py b/bindings/python/iota_sdk/client/client.py index ea86d67e78..067fc2c337 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. diff --git a/bindings/python/iota_sdk/types/output.py b/bindings/python/iota_sdk/types/output.py index d2b9686113..d1ddab28fe 100644 --- a/bindings/python/iota_sdk/types/output.py +++ b/bindings/python/iota_sdk/types/output.py @@ -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,7 +101,6 @@ class AccountOutput: encoder=str )) account_id: HexStr - state_index: int foundry_counter: int unlock_conditions: List[Union[AddressUnlockCondition, ]] = field( @@ -122,7 +117,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 0a53117c62..21853b061c 100644 --- a/bindings/python/iota_sdk/types/send_params.py +++ b/bindings/python/iota_sdk/types/send_params.py @@ -114,9 +114,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_output.py b/bindings/python/tests/test_output.py index c862f66f4b..34166ddaaa 100644 --- a/bindings/python/tests/test_output.py +++ b/bindings/python/tests/test_output.py @@ -116,19 +116,12 @@ def test_output(): "foundryCounter": 0, "unlockConditions": [ { - "type": 4, + "type": 0, "address": { "type": 0, "pubKeyHash": "0x1f964c683db3072db2ad26ec4b4bee69fb4224755e65566e284fc2aac057edbc" } }, - { - "type": 5, - "address": { - "type": 0, - "pubKeyHash": "0x1f964c683db3072db2ad26ec4b4bee69fb4224755e65566e284fc2aac057edbc" - } - } ], "features": [ { @@ -151,19 +144,12 @@ def test_output(): "foundryCounter": 1, "unlockConditions": [ { - "type": 4, + "type": 0, "address": { "type": 0, "pubKeyHash": "0xc5976c01059227e9246686f138b29d13c3a85efd8a2154729dce23a3dfd52119" } }, - { - "type": 5, - "address": { - "type": 0, - "pubKeyHash": "0xc5976c01059227e9246686f138b29d13c3a85efd8a2154729dce23a3dfd52119" - } - } ], "immutableFeatures": [ { From 2dd6618198e2f853249b6ed71e748e2ee65ec4e4 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:33:21 +0200 Subject: [PATCH 27/56] Nits --- sdk/src/types/block/rand/address.rs | 1 + sdk/src/types/block/unlock/anchor.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/src/types/block/rand/address.rs b/sdk/src/types/block/rand/address.rs index 5f9416efb5..60eda24b66 100644 --- a/sdk/src/types/block/rand/address.rs +++ b/sdk/src/types/block/rand/address.rs @@ -27,6 +27,7 @@ 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 { diff --git a/sdk/src/types/block/unlock/anchor.rs b/sdk/src/types/block/unlock/anchor.rs index a8103d9914..7a65a1efd6 100644 --- a/sdk/src/types/block/unlock/anchor.rs +++ b/sdk/src/types/block/unlock/anchor.rs @@ -1,4 +1,4 @@ -// Copyright 2020-2021 IOTA Stiftung +// Copyright 2023 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 use crate::types::block::{unlock::UnlockIndex, Error}; From e70a204a953e78be411b32bb0bfe25783927785e Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:39:19 +0200 Subject: [PATCH 28/56] Remove TODO --- .../operations/syncing/addresses/output_ids/account_foundry.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs index 0bc6eae374..9554764de5 100644 --- a/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs +++ b/sdk/src/wallet/account/operations/syncing/addresses/output_ids/account_foundry.rs @@ -26,7 +26,6 @@ impl Account where crate::wallet::Error: From, { - // TODO /// Returns output ids of account outputs pub(crate) async fn get_account_and_foundry_output_ids( &self, From 1d01c9e355abb1c7e18a55ab8858e605c3bb8f29 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:47:10 +0200 Subject: [PATCH 29/56] Doc nit --- sdk/src/types/block/rand/output/unlock_condition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/types/block/rand/output/unlock_condition.rs b/sdk/src/types/block/rand/output/unlock_condition.rs index e54d0576b9..05f0982848 100644 --- a/sdk/src/types/block/rand/output/unlock_condition.rs +++ b/sdk/src/types/block/rand/output/unlock_condition.rs @@ -17,7 +17,7 @@ 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( anchor_id: &AnchorId, ) -> StateControllerAddressUnlockCondition { From cf1a9479f1d831faab27e0f90872abe9dd0b9203 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:51:02 +0200 Subject: [PATCH 30/56] Add Anchor to def_is_as_opt --- sdk/src/types/block/output/mod.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index ee6c27d923..0991e8ea6b 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -254,22 +254,7 @@ impl Output { } } - def_is_as_opt!(Output: Basic, Account, Foundry, Nft, Delegation); - - /// Checks whether the output is a [`AnchorOutput`]. - pub fn is_anchor(&self) -> bool { - matches!(self, Self::Anchor(_)) - } - - /// Gets the output as an actual [`AnchorOutput`]. - /// NOTE: Will panic if the output is not a [`AnchorOutput`]. - pub fn as_anchor(&self) -> &AnchorOutput { - if let Self::Anchor(output) = self { - output - } else { - panic!("invalid downcast of non-AnchorOutput"); - } - } + 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. From fdabbb9126ee05466d03f9cf91367c4b0dd06194 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 19 Oct 2023 15:57:34 +0200 Subject: [PATCH 31/56] Display delegations/anchors in CLI addresses cmd --- cli/src/command/account.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cli/src/command/account.rs b/cli/src/command/account.rs index a177c9d448..576b9585f2 100644 --- a/cli/src/command/account.rs +++ b/cli/src/command/account.rs @@ -937,9 +937,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() @@ -959,16 +961,14 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), 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::Anchor(_) => { - // 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 @@ -986,13 +986,15 @@ async fn print_address(account: &Account, address: &Bip44Address) -> Result<(), } log = format!( - "{log}\n Outputs: {:#?}\n Base coin amount: {}\n Native Tokens: {:?}\n NFTs: {:?}\n Accounts: {:?}\n Foundries: {:?}\n", + "{log}\n Outputs: {:#?}\n Base coin amount: {}\n Native Tokens: {:?}\n Accounts: {:?}\n Foundries: {:?}\n NFTs: {:?}\n Delegations: {:?}\n Anchors: {:?}\n", output_ids, amount, native_tokens.finish_vec()?, - nfts, accounts, foundries, + nfts, + delegations, + anchors ); println_log_info!("{log}"); From 55e6b7a75926d919539168d36b12ef741fa3a7d0 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 20 Oct 2023 16:03:18 +0200 Subject: [PATCH 32/56] Update sdk/src/client/api/block_builder/input_selection/mod.rs Co-authored-by: Thoralf-M <46689931+Thoralf-M@users.noreply.github.com> --- sdk/src/client/api/block_builder/input_selection/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3641d3ace9..5e4a592138 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -210,7 +210,7 @@ impl InputSelection { fn filter_inputs(&mut self) { self.available_inputs.retain(|input| { // TODO what about other kinds? - // Filter out non basic/foundry/nft outputs. + // Filter out non account/basic/foundry/nft outputs. if !input.output.is_basic() && !input.output.is_account() && !input.output.is_foundry() From b39e1483ff48844470144f2ed4b55d04a0d2cc71 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Mon, 23 Oct 2023 11:20:20 +0200 Subject: [PATCH 33/56] Fix warning --- .../types/client/output_builder_params/account-output-params.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ae203e48d9..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'; /** From 5bb1090da156b4cfe47d38ced91e67a53c53b213 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Mon, 23 Oct 2023 11:47:57 +0200 Subject: [PATCH 34/56] Cleanup account transition validation --- sdk/src/types/block/output/account.rs | 92 ++++++++++++--------------- sdk/src/types/block/output/anchor.rs | 2 +- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 62262dc51f..abf01c1456 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -457,63 +457,55 @@ impl AccountOutput { pub(crate) fn transition_inner( current_state: &Self, next_state: &Self, - _input_chains: &HashMap, - _outputs: &[Output], + input_chains: &HashMap, + outputs: &[Output], ) -> Result<(), StateTransitionError> { if current_state.immutable_features != next_state.immutable_features { return Err(StateTransitionError::MutatedImmutableField); } - // TODO - // if next_state.state_index == current_state.state_index + 1 { - // // 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; - - // 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 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, - // }); + // 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; + + 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 current_state.foundry_counter + created_foundries_count != next_state.foundry_counter { + return Err(StateTransitionError::InconsistentCreatedFoundriesCount); + } + Ok(()) } } diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index 308c9a87b5..25ee7f59e6 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -1,4 +1,4 @@ -// Copyright 2021 IOTA Stiftung +// Copyright 2023 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 use alloc::{collections::BTreeSet, vec::Vec}; From 72f6fa509923037da50bb115c9447fe52ce85fe7 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 13:45:38 +0200 Subject: [PATCH 35/56] Reviews --- bindings/python/iota_sdk/types/output.py | 33 ++++++++++++------------ sdk/src/types/block/output/anchor.rs | 15 ++++++----- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/bindings/python/iota_sdk/types/output.py b/bindings/python/iota_sdk/types/output.py index d1ddab28fe..c2015088b8 100644 --- a/bindings/python/iota_sdk/types/output.py +++ b/bindings/python/iota_sdk/types/output.py @@ -102,30 +102,29 @@ class AccountOutput: )) account_id: HexStr foundry_counter: int - unlock_conditions: List[Union[AddressUnlockCondition, - ]] = field( - metadata=config( + unlock_conditions: List[AddressUnlockCondition]] = field( + metadata = config( decoder=deserialize_unlock_conditions )) features: Optional[List[Union[SenderFeature, MetadataFeature]]] = field(default=None, - metadata=config( + metadata = config( decoder=deserialize_features )) immutable_features: Optional[List[Union[IssuerFeature, MetadataFeature]]] = field(default=None, - metadata=config( + metadata = config( decoder=deserialize_features )) native_tokens: Optional[List[NativeToken]] = None type: int = field( - default_factory=lambda: int( + default_factory = lambda: int( OutputType.Account), - init=False) + init = False) -@json -@dataclass +@ json +@ dataclass class FoundryOutput: """Describes a foundry output. Attributes: @@ -153,22 +152,22 @@ class FoundryOutput: token_scheme: SimpleTokenScheme unlock_conditions: List[ImmutableAccountAddressUnlockCondition] features: Optional[List[MetadataFeature]] = field(default=None, - metadata=config( + metadata = config( decoder=deserialize_features )) immutable_features: Optional[List[MetadataFeature]] = field(default=None, - metadata=config( + metadata = config( decoder=deserialize_features )) native_tokens: Optional[List[NativeToken]] = None type: int = field( - default_factory=lambda: int( + default_factory = lambda: int( OutputType.Foundry), - init=False) + init = False) -@json -@dataclass +@ json +@ dataclass class NftOutput: """Describes an NFT output. Attributes: @@ -198,12 +197,12 @@ class NftOutput: nft_id: HexStr unlock_conditions: List[Union[AddressUnlockCondition, ExpirationUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition]] = field( - metadata=config( + metadata = config( decoder=deserialize_unlock_conditions )) features: Optional[List[Union[SenderFeature, MetadataFeature, TagFeature]]] = field(default=None, - metadata=config( + metadata = config( decoder=deserialize_features )) immutable_features: Optional[List[Union[ diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index 58e9e8446a..596e9f672e 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -358,21 +358,22 @@ pub(crate) type StateMetadataLength = BoundedU16<0, { AnchorOutput::STATE_METADA /// 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 of IOTA coins held by the output. amount: u64, mana: u64, - // Native tokens held by the output. + /// Native tokens held by the output. native_tokens: NativeTokens, - // Unique identifier of the anchor. + /// Unique identifier of the anchor. anchor_id: AnchorId, - // A counter that must increase by 1 every time the anchor is state transitioned. + /// 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. + /// 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, } From ea9c91ff072a0dfc206f05929e4a1495eb8a202e Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 13:55:11 +0200 Subject: [PATCH 36/56] Nit --- sdk/src/types/block/output/account.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 35e9f148c2..4c3de6b755 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -645,7 +645,6 @@ fn verify_unlock_conditions(unlock_conditions: &UnlockConditions, account_id: &A #[cfg(feature = "serde")] pub(crate) mod dto { - use serde::{Deserialize, Serialize}; use super::*; From 33b66e6f9a81bb1e09d4f5d7e3f6a8a9dc1d3546 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 14:01:47 +0200 Subject: [PATCH 37/56] Add ISA UnsupportedAddressType error --- sdk/src/client/api/block_builder/input_selection/error.rs | 4 ++++ .../api/block_builder/input_selection/requirement/sender.rs | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) 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/requirement/sender.rs b/sdk/src/client/api/block_builder/input_selection/requirement/sender.rs index 4193c89fb0..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 @@ -42,8 +42,7 @@ impl InputSelection { Err(e) => Err(e), } } - Address::Anchor(_) => todo!(), - _ => todo!("What do we do here?"), + _ => Err(Error::UnsupportedAddressType(address.kind())), } } } From b3a5f9bcb3cec87a1295a314e9634cfec83039e7 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 14:04:45 +0200 Subject: [PATCH 38/56] impl From<&OutputId> for AnchorAddress --- sdk/src/types/block/address/anchor.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sdk/src/types/block/address/anchor.rs b/sdk/src/types/block/address/anchor.rs index f7a9c49f6e..efa797862b 100644 --- a/sdk/src/types/block/address/anchor.rs +++ b/sdk/src/types/block/address/anchor.rs @@ -5,7 +5,10 @@ use core::str::FromStr; use derive_more::{AsRef, Deref, From}; -use crate::types::block::{output::AnchorId, Error}; +use crate::types::block::{ + output::{AnchorId, OutputId}, + Error, +}; /// An anchor address. #[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, From, AsRef, Deref, packable::Packable)] @@ -45,6 +48,12 @@ impl FromStr for AnchorAddress { } } +impl From<&OutputId> for AnchorAddress { + fn from(output_id: &OutputId) -> Self { + Self(AnchorId::from(output_id)) + } +} + impl core::fmt::Display for AnchorAddress { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{}", self.0) From fc9c052779445a7f4adaad671201119c20c83883 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 21:55:30 +0200 Subject: [PATCH 39/56] Update addresses order and types --- sdk/src/client/secret/ledger_nano.rs | 6 +++--- sdk/src/client/secret/mod.rs | 2 +- sdk/src/client/utils.rs | 2 +- sdk/src/types/block/address/anchor.rs | 2 +- .../types/block/address/implicit_account_creation.rs | 2 +- sdk/src/types/block/address/mod.rs | 12 ++++++------ sdk/src/types/block/address/restricted.rs | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index 4b42615c38..b7c77ea332 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -524,12 +524,12 @@ fn merge_unlocks( 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(_) => todo!(), _ => todo!("What do we do here?"), diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index c0320c2f93..a86c08c711 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -519,10 +519,10 @@ where 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(_) => todo!(), _ => todo!("What do we do here?"), diff --git a/sdk/src/client/utils.rs b/sdk/src/client/utils.rs index 646dff6e4d..054c62a425 100644 --- a/sdk/src/client/utils.rs +++ b/sdk/src/client/utils.rs @@ -31,9 +31,9 @@ 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(), - Address::Anchor(anchor) => anchor.to_string(), }) } diff --git a/sdk/src/types/block/address/anchor.rs b/sdk/src/types/block/address/anchor.rs index efa797862b..1cf57a8583 100644 --- a/sdk/src/types/block/address/anchor.rs +++ b/sdk/src/types/block/address/anchor.rs @@ -17,7 +17,7 @@ pub struct AnchorAddress(AnchorId); impl AnchorAddress { /// The [`Address`](crate::types::block::address::Address) kind of an [`AnchorAddress`]. - pub const KIND: u8 = 48; + pub const KIND: u8 = 24; /// The length of an [`AnchorAddress`]. pub const LENGTH: usize = AnchorId::LENGTH; diff --git a/sdk/src/types/block/address/implicit_account_creation.rs b/sdk/src/types/block/address/implicit_account_creation.rs index cbb4344c55..0e84919af6 100644 --- a/sdk/src/types/block/address/implicit_account_creation.rs +++ b/sdk/src/types/block/address/implicit_account_creation.rs @@ -15,7 +15,7 @@ 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; diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index 54d315cef5..6e0a6881d6 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -46,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), @@ -53,9 +56,6 @@ pub enum Address { #[packable(tag = RestrictedAddress::KIND)] #[from(ignore)] Restricted(Box), - /// An anchor address. - #[packable(tag = AnchorAddress::KIND)] - Anchor(AnchorAddress), } impl From for Address { @@ -70,9 +70,9 @@ 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), - Self::Anchor(address) => address.fmt(f), } } } @@ -84,13 +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, - Self::Anchor(_) => AnchorAddress::KIND, } } - crate::def_is_as_opt!(Address: Ed25519, Account, Nft, ImplicitAccountCreation, Restricted, Anchor); + 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 { diff --git a/sdk/src/types/block/address/restricted.rs b/sdk/src/types/block/address/restricted.rs index 860d84c68e..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)] From 6d18e5da2900d9d4d6e5c914e1d8cdee5f5a6544 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 26 Oct 2023 22:49:43 +0200 Subject: [PATCH 40/56] Update restricted address tests --- sdk/tests/types/address/restricted.rs | 147 +++++++++++++++++--------- 1 file changed, 96 insertions(+), 51 deletions(-) diff --git a/sdk/tests/types/address/restricted.rs b/sdk/tests/types/address/restricted.rs index eeee5d0d57..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,135 +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" ); - // TODO reenable when TIP is updated - // // Restricted Ed25519 Address (Every Capability Allowed) - // address.set_allowed_capabilities(AddressCapabilities::all()); - // assert_eq!( - // address.clone().to_bech32_unchecked("iota"), - // "iota19qqwlhq39mlzv2esf08n0xexcvd66q5lv9hw8mz25c695dnwfj0y8gcplupydhwt" - // ); + // 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"), + "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" ); - // TODO reenable when TIP is updated - // // Restricted Account Address (Every Capability Allowed) - // address.set_allowed_capabilities(AddressCapabilities::all()); - // assert_eq!( - // address.clone().to_bech32_unchecked("iota"), - // "iota19qy0rsq3ld2d7jjwtvr5vffklwkvw7dlsrxytcpmcdqssdjc0d80exqplurds6sq" - // ); + // 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"), + "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" ); - // TODO reenable when TIP is updated - // // Restricted NFT Address (Every Capability Allowed) - // address.set_allowed_capabilities(AddressCapabilities::all()); - // assert_eq!( - // address.clone().to_bech32_unchecked("iota"), - // "iota19qgvw2n94efawzue54lhycmml5w4afa6526t5z2unzdkvlfc2kqg0kcpluts738a" - // ); + // 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"), + "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" ); } From 2fd1cfec89b37ac81684ea92ee3849c3b020064a Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 11:13:52 +0200 Subject: [PATCH 41/56] Address semantic TODOs --- sdk/src/types/block/semantic.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/src/types/block/semantic.rs b/sdk/src/types/block/semantic.rs index 54c7bdf048..68bcdfee83 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, @@ -255,7 +255,7 @@ pub fn semantic_validation( None, output.unlock_conditions(), ), - Output::Anchor(_) => todo!(), + Output::Anchor(_) => return Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), }; if let Err(conflict) = conflict { @@ -338,7 +338,7 @@ pub fn semantic_validation( Some(output.features()), ), Output::Delegation(output) => (output.amount(), 0, None, None), - Output::Anchor(_) => todo!(), + Output::Anchor(_) => return Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), }; if let Some(unlock_conditions) = created_output.unlock_conditions() { @@ -353,6 +353,7 @@ pub fn semantic_validation( _ => None, }) .filter_map(Address::as_restricted_opt); + for address in addresses { if created_output.native_tokens().map(|t| t.len()).unwrap_or_default() > 0 && !address.has_capability(AddressCapabilityFlag::OutputsWithNativeTokens) @@ -391,7 +392,6 @@ pub fn semantic_validation( Output::Account(_) => !address.has_capability(AddressCapabilityFlag::AccountOutputs), Output::Nft(_) => !address.has_capability(AddressCapabilityFlag::NftOutputs), Output::Delegation(_) => !address.has_capability(AddressCapabilityFlag::DelegationOutputs), - // TODO do we really want to handle it? Output::Anchor(_) => !address.has_capability(AddressCapabilityFlag::AnchorOutputs), _ => false, } { From af7748b2b395e0640662916d102485bdd5114174 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 11:24:07 +0200 Subject: [PATCH 42/56] required_and_unlocked_address TODO --- sdk/src/types/block/output/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/types/block/output/mod.rs b/sdk/src/types/block/output/mod.rs index 81a94cecb1..b45ab7afd3 100644 --- a/sdk/src/types/block/output/mod.rs +++ b/sdk/src/types/block/output/mod.rs @@ -292,7 +292,7 @@ impl Output { .clone(), None, )), - Self::Anchor(_) => todo!(), + Self::Anchor(_) => Err(Error::UnsupportedOutputKind(AnchorOutput::KIND)), } } From 8ee63dd8541d233db403f68cd8b0a5044d0518ca Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 11:35:31 +0200 Subject: [PATCH 43/56] Address unlock TODO --- sdk/src/types/block/address/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/src/types/block/address/mod.rs b/sdk/src/types/block/address/mod.rs index 6e0a6881d6..752f290aaf 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -159,7 +159,8 @@ impl Address { return Err(TransactionFailureReason::InvalidInputUnlock); } } - (Self::Anchor(_), Unlock::Anchor(_)) => todo!(), + // 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), } From ac111ed4f2207546155c55b45ca7dd59343142d5 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 11:58:51 +0200 Subject: [PATCH 44/56] Secret TODO --- sdk/src/client/secret/mod.rs | 6 +++--- sdk/src/types/block/error.rs | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/sdk/src/client/secret/mod.rs b/sdk/src/client/secret/mod.rs index a86c08c711..44237f3890 100644 --- a/sdk/src/client/secret/mod.rs +++ b/sdk/src/client/secret/mod.rs @@ -51,13 +51,13 @@ use crate::{ Error, }, types::block::{ - address::{Address, Ed25519Address}, + address::{Address, AnchorAddress, Ed25519Address}, core::BlockWrapperBuilder, output::Output, payload::SignedTransactionPayload, signature::{Ed25519Signature, Signature}, unlock::{AccountUnlock, NftUnlock, ReferenceUnlock, SignatureUnlock, Unlock, Unlocks}, - BlockWrapper, + BlockWrapper, Error as BlockError, }, }; @@ -524,7 +524,7 @@ where } 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(_) => todo!(), + Address::Anchor(_) => Err(BlockError::UnsupportedAddressKind(AnchorAddress::KIND))?, _ => todo!("What do we do here?"), }, None => { diff --git a/sdk/src/types/block/error.rs b/sdk/src/types/block/error.rs index 30c250e51b..696f70a415 100644 --- a/sdk/src/types/block/error.rs +++ b/sdk/src/types/block/error.rs @@ -174,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, @@ -387,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"), From 7499d1e8a2be75ec66723e0148a0d8c596a369c4 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 12:02:05 +0200 Subject: [PATCH 45/56] Ledger nano TODO --- sdk/src/client/secret/ledger_nano.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/src/client/secret/ledger_nano.rs b/sdk/src/client/secret/ledger_nano.rs index b7c77ea332..80fff366f7 100644 --- a/sdk/src/client/secret/ledger_nano.rs +++ b/sdk/src/client/secret/ledger_nano.rs @@ -26,11 +26,12 @@ use crate::{ 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, }, }; @@ -531,7 +532,7 @@ fn merge_unlocks( 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(_) => todo!(), + Address::Anchor(_) => Err(BlockError::UnsupportedAddressKind(AnchorAddress::KIND))?, _ => todo!("What do we do here?"), }, None => { From 23040031681f6b0c4817ec4afbfbb0917aa7d313 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 12:31:41 +0200 Subject: [PATCH 46/56] Reenable test --- sdk/src/types/block/output/anchor.rs | 168 ++++++++++++------------- sdk/src/types/block/rand/output/mod.rs | 30 ++++- 2 files changed, 109 insertions(+), 89 deletions(-) diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index 596e9f672e..be4c925466 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -846,90 +846,84 @@ pub(crate) mod dto { } } -// #[cfg(test)] -// mod tests { - -// use super::*; -// use crate::types::{ -// block::{ -// output::{dto::OutputDto, FoundryId, SimpleTokenScheme, TokenId}, -// protocol::protocol_parameters, -// rand::{ -// address::rand_anchor_address, -// output::{ -// feature::rand_allowed_features, -// rand_account_output, rand_anchor_id, -// 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_account_output(protocol_parameters.token_supply()); -// let dto = OutputDto::Account((&output).into()); -// let output_unver = Output::try_from_dto(dto.clone()).unwrap(); -// assert_eq!(&output, output_unver.as_account()); -// let output_ver = Output::try_from_dto_with_params(dto, &protocol_parameters).unwrap(); -// assert_eq!(&output, output_ver.as_account()); - -// 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 foundry_id = FoundryId::build(&rand_anchor_address(), 0, SimpleTokenScheme::KIND); -// 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_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) -// .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); - -// let builder = AnchorOutput::build_with_minimum_storage_deposit(protocol_parameters.rent_structure(), -// anchor_id) .add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap()) -// .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); -// } -// } +#[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/rand/output/mod.rs b/sdk/src/types/block/rand/output/mod.rs index f4a6cb8cab..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, @@ -25,6 +26,8 @@ use crate::types::block::{ 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, }, }, transaction::rand_transaction_id, @@ -51,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. @@ -63,6 +71,24 @@ pub fn rand_account_output(token_supply: u64) -> AccountOutput { .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( + &anchor_id, + )) + .finish_with_params(token_supply) + .unwrap() +} + /// Generates a random [`TokenScheme`]. pub fn rand_token_scheme() -> TokenScheme { let max = U256::from(rand_bytes_array()).saturating_add(U256::one()); From 347fa7b519b47b921881b7c215d3aaa6ae6ab69f Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 12:36:51 +0200 Subject: [PATCH 47/56] Typo --- sdk/src/types/block/output/account.rs | 8 ++++++-- sdk/src/types/block/output/anchor.rs | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sdk/src/types/block/output/account.rs b/sdk/src/types/block/output/account.rs index 4c3de6b755..08d0f1f96a 100644 --- a/sdk/src/types/block/output/account.rs +++ b/sdk/src/types/block/output/account.rs @@ -49,7 +49,11 @@ impl From<&OutputId> for AccountId { impl AccountId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { Self::from(output_id) } else { self } + if self.is_null() { + Self::from(output_id) + } else { + self + } } } @@ -412,7 +416,7 @@ impl AccountOutput { /// #[inline(always)] pub fn address(&self) -> &Address { - // An AccountOutput must have a, AddressUnlockCondition. + // An AccountOutput must have an AddressUnlockCondition. self.unlock_conditions .address() .map(|unlock_condition| unlock_condition.address()) diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index be4c925466..4d17ae634f 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -50,7 +50,11 @@ impl From<&OutputId> for AnchorId { impl AnchorId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { Self::from(output_id) } else { self } + if self.is_null() { + Self::from(output_id) + } else { + self + } } } @@ -848,7 +852,6 @@ pub(crate) mod dto { #[cfg(test)] mod tests { - use super::*; use crate::types::{ block::{ From f5aff003b07445abff6c4799f9a4e31d17b6dce7 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 12:54:40 +0200 Subject: [PATCH 48/56] Warning --- sdk/src/types/block/output/anchor.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sdk/src/types/block/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index 26edc08e2d..f0deb9fc44 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -50,7 +50,11 @@ impl From<&OutputId> for AnchorId { impl AnchorId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { Self::from(output_id) } else { self } + if self.is_null() { + Self::from(output_id) + } else { + self + } } } @@ -502,7 +506,6 @@ impl AnchorOutput { &self, output_id: &OutputId, unlock: &Unlock, - inputs: &[(&OutputId, &Output)], context: &mut SemanticValidationContext<'_>, ) -> Result<(), TransactionFailureReason> { let anchor_id = if self.anchor_id().is_null() { From d4565594fd2b891dbf990e0acc959003e14d84d3 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 13:09:33 +0200 Subject: [PATCH 49/56] Address Display --- sdk/src/types/block/address/account.rs | 10 ++-------- sdk/src/types/block/address/anchor.rs | 10 ++-------- sdk/src/types/block/address/bech32.rs | 10 ++-------- .../types/block/address/implicit_account_creation.rs | 8 +++++++- sdk/src/types/block/address/mod.rs | 4 ++-- sdk/src/types/block/address/nft.rs | 10 ++-------- sdk/src/types/block/output/anchor.rs | 6 +----- 7 files changed, 18 insertions(+), 40 deletions(-) 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 index 1cf57a8583..d15af00f0e 100644 --- a/sdk/src/types/block/address/anchor.rs +++ b/sdk/src/types/block/address/anchor.rs @@ -3,7 +3,7 @@ use core::str::FromStr; -use derive_more::{AsRef, Deref, From}; +use derive_more::{AsRef, Deref, Display, From}; use crate::types::block::{ output::{AnchorId, OutputId}, @@ -11,7 +11,7 @@ use crate::types::block::{ }; /// An anchor 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 AnchorAddress(AnchorId); @@ -54,12 +54,6 @@ impl From<&OutputId> for AnchorAddress { } } -impl core::fmt::Display for AnchorAddress { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.0) - } -} - impl core::fmt::Debug for AnchorAddress { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "AnchorAddress({self})") 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 0e84919af6..ecb900e7ab 100644 --- a/sdk/src/types/block/address/implicit_account_creation.rs +++ b/sdk/src/types/block/address/implicit_account_creation.rs @@ -9,7 +9,7 @@ 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); @@ -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 7b78775c27..fa6dda1a84 100644 --- a/sdk/src/types/block/address/mod.rs +++ b/sdk/src/types/block/address/mod.rs @@ -11,7 +11,7 @@ mod restricted; use alloc::boxed::Box; -use derive_more::From; +use derive_more::{Display, From}; use packable::Packable; pub use self::{ @@ -32,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))] 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/output/anchor.rs b/sdk/src/types/block/output/anchor.rs index f0deb9fc44..703b7719fd 100644 --- a/sdk/src/types/block/output/anchor.rs +++ b/sdk/src/types/block/output/anchor.rs @@ -50,11 +50,7 @@ impl From<&OutputId> for AnchorId { impl AnchorId { /// pub fn or_from_output_id(self, output_id: &OutputId) -> Self { - if self.is_null() { - Self::from(output_id) - } else { - self - } + if self.is_null() { Self::from(output_id) } else { self } } } From 5eed84aade4333f412bcd568fea9db35837e9848 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 13:38:30 +0200 Subject: [PATCH 50/56] ISA nits --- sdk/src/client/api/block_builder/input_selection/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 891a2a1f91..445a7cc3cc 100644 --- a/sdk/src/client/api/block_builder/input_selection/mod.rs +++ b/sdk/src/client/api/block_builder/input_selection/mod.rs @@ -18,7 +18,7 @@ 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, ChainId, FoundryOutput, NativeTokensBuilder, NftOutput, Output, OutputId, OUTPUT_COUNT_RANGE, @@ -67,7 +67,7 @@ impl InputSelection { 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(_) => todo!(), + Address::Anchor(_) => Err(Error::UnsupportedAddressType(AnchorAddress::KIND)), _ => todo!("What do we do here?"), } } @@ -210,7 +210,7 @@ impl InputSelection { fn filter_inputs(&mut self) { self.available_inputs.retain(|input| { // TODO what about other kinds? - // Filter out non account/basic/foundry/nft outputs. + // Filter out non basic/account/foundry/nft outputs. if !input.output.is_basic() && !input.output.is_account() && !input.output.is_foundry() From c839f39ebe9b6426d276afb6c1da8c4eff9a55aa Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 13:46:50 +0200 Subject: [PATCH 51/56] Move anchor tx cap --- .../payload/signed_transaction/transaction.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sdk/src/types/block/payload/signed_transaction/transaction.rs b/sdk/src/types/block/payload/signed_transaction/transaction.rs index c50c65c915..a02b2e3629 100644 --- a/sdk/src/types/block/payload/signed_transaction/transaction.rs +++ b/sdk/src/types/block/payload/signed_transaction/transaction.rs @@ -476,18 +476,18 @@ pub enum TransactionCapabilityFlag { BurnNativeTokens, BurnMana, DestroyAccountOutputs, + DestroyAnchorOutputs, DestroyFoundryOutputs, DestroyNftOutputs, - DestroyAnchorOutputs, } 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 = 0b00100000; + const DESTROY_ANCHOR_OUTPUTS: u8 = 0b00001000; + const DESTROY_FOUNDRY_OUTPUTS: u8 = 0b00010000; + const DESTROY_NFT_OUTPUTS: u8 = 0b00100000; } impl CapabilityFlag for TransactionCapabilityFlag { @@ -498,9 +498,9 @@ impl CapabilityFlag for TransactionCapabilityFlag { 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, - Self::DestroyAnchorOutputs => Self::DESTROY_ANCHOR_OUTPUTS, } } @@ -509,9 +509,9 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::BurnNativeTokens | Self::BurnMana | Self::DestroyAccountOutputs + | Self::DestroyAnchorOutputs | Self::DestroyFoundryOutputs - | Self::DestroyNftOutputs - | Self::DestroyAnchorOutputs => 0, + | Self::DestroyNftOutputs => 0, } } @@ -520,9 +520,9 @@ impl CapabilityFlag for TransactionCapabilityFlag { Self::BurnNativeTokens, Self::BurnMana, Self::DestroyAccountOutputs, + Self::DestroyAnchorOutputs, Self::DestroyFoundryOutputs, Self::DestroyNftOutputs, - Self::DestroyAnchorOutputs, ] .into_iter() } From 72de3873c4281e21dee91a09bd22dd760192006b Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 15:09:57 +0200 Subject: [PATCH 52/56] Update rand address modulo --- sdk/src/types/block/rand/address.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/types/block/rand/address.rs b/sdk/src/types/block/rand/address.rs index 60eda24b66..60e0125ca3 100644 --- a/sdk/src/types/block/rand/address.rs +++ b/sdk/src/types/block/rand/address.rs @@ -30,7 +30,7 @@ pub fn rand_anchor_address() -> AnchorAddress { // 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(), From 0eb1d163fe60d7e11c06fa0281312583239faf85 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 15:21:34 +0200 Subject: [PATCH 53/56] then_some(index) --- .../input_selection/requirement/ed25519.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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 996d257cca..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 @@ -54,15 +54,7 @@ impl InputSelection { } 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 self.available_has_ed25519_address(input, address) { - Some(index) - } else { - None - } - } else { - None - } + (!input.output.is_basic() && self.available_has_ed25519_address(input, address)).then_some(index) }) }; From 6fbb50bb00676879dace44264b174ecc8394ba6d Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 15:49:37 +0200 Subject: [PATCH 54/56] Fix nodejs example --- bindings/nodejs/examples/how_tos/outputs/features.ts | 2 +- bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) 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 248a668d46..d5aa2fd00b 100644 --- a/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts +++ b/bindings/nodejs/examples/how_tos/outputs/unlock-conditions.ts @@ -20,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(); @@ -97,7 +97,6 @@ async function run() { basicOutputWithStorageReturn, basicOutputWithTimelock, basicOutputWithExpiration, - accountOutput, foundryOutput, ], null, From 378cb787a9c1b8afc0926622cf442845fce924c0 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 16:36:47 +0200 Subject: [PATCH 55/56] Fix python --- bindings/python/iota_sdk/types/output.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bindings/python/iota_sdk/types/output.py b/bindings/python/iota_sdk/types/output.py index c2015088b8..cb2bc2ad31 100644 --- a/bindings/python/iota_sdk/types/output.py +++ b/bindings/python/iota_sdk/types/output.py @@ -102,25 +102,25 @@ class AccountOutput: )) account_id: HexStr foundry_counter: int - unlock_conditions: List[AddressUnlockCondition]] = field( - metadata = config( + unlock_conditions: List[AddressUnlockCondition] = field( + metadata=config( decoder=deserialize_unlock_conditions )) features: Optional[List[Union[SenderFeature, MetadataFeature]]] = field(default=None, - metadata = config( + metadata=config( decoder=deserialize_features )) immutable_features: Optional[List[Union[IssuerFeature, MetadataFeature]]] = field(default=None, - metadata = config( + metadata=config( decoder=deserialize_features )) native_tokens: Optional[List[NativeToken]] = None type: int = field( - default_factory = lambda: int( + default_factory=lambda: int( OutputType.Account), - init = False) + init=False) @ json @@ -152,18 +152,18 @@ class FoundryOutput: token_scheme: SimpleTokenScheme unlock_conditions: List[ImmutableAccountAddressUnlockCondition] features: Optional[List[MetadataFeature]] = field(default=None, - metadata = config( + metadata=config( decoder=deserialize_features )) immutable_features: Optional[List[MetadataFeature]] = field(default=None, - metadata = config( + metadata=config( decoder=deserialize_features )) native_tokens: Optional[List[NativeToken]] = None type: int = field( - default_factory = lambda: int( + default_factory=lambda: int( OutputType.Foundry), - init = False) + init=False) @ json @@ -197,12 +197,12 @@ class NftOutput: nft_id: HexStr unlock_conditions: List[Union[AddressUnlockCondition, ExpirationUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition]] = field( - metadata = config( + metadata=config( decoder=deserialize_unlock_conditions )) features: Optional[List[Union[SenderFeature, MetadataFeature, TagFeature]]] = field(default=None, - metadata = config( + metadata=config( decoder=deserialize_features )) immutable_features: Optional[List[Union[ From d18127c1f3af1aafa93b47fc4bf5dee61af57fb9 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 27 Oct 2023 17:06:46 +0200 Subject: [PATCH 56/56] wtf --- bindings/python/iota_sdk/types/output.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bindings/python/iota_sdk/types/output.py b/bindings/python/iota_sdk/types/output.py index cb2bc2ad31..3bf4a93186 100644 --- a/bindings/python/iota_sdk/types/output.py +++ b/bindings/python/iota_sdk/types/output.py @@ -123,8 +123,8 @@ class AccountOutput: init=False) -@ json -@ dataclass +@json +@dataclass class FoundryOutput: """Describes a foundry output. Attributes: @@ -166,8 +166,8 @@ class FoundryOutput: init=False) -@ json -@ dataclass +@json +@dataclass class NftOutput: """Describes an NFT output. Attributes: