diff --git a/.github/workflows/check-contract-schema.yml b/.github/workflows/check-contract-schema.yml index 700440bdd5..6de645dfa5 100644 --- a/.github/workflows/check-contract-schema.yml +++ b/.github/workflows/check-contract-schema.yml @@ -13,13 +13,19 @@ on: jobs: check-schema: name: Generate and check schema - runs-on: ubuntu-latest + runs-on: custom-runner-linux steps: - name: Check out repository code uses: actions/checkout@v2 - + + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Generate the schema run: make contract-schema - name: Check for diff - run: git diff --exit-code + run: git diff --exit-code -- contracts/*/schema diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml index 82068fce76..80688c2ccc 100644 --- a/.github/workflows/ci-dev.yml +++ b/.github/workflows/ci-dev.yml @@ -1,6 +1,7 @@ name: CI dev-portal on: + workflow_dispatch: push: branches-ignore: master paths: diff --git a/.github/workflows/contracts-build.yml b/.github/workflows/contracts-build.yml index f44f291f1b..8a0a5d4122 100644 --- a/.github/workflows/contracts-build.yml +++ b/.github/workflows/contracts-build.yml @@ -14,7 +14,7 @@ jobs: - name: Install Rust stable uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: 1.69.0 target: wasm32-unknown-unknown override: true components: rustfmt, clippy diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ec4a60145..19988720df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [1.1.27] (2023-08-16) + +- fix serialisation of contract types ([#3752]) +- Investigate spending credentials from the main API (coconut enabled to a gateway) from feature/ephemera branch ([#3741]) +- NymConnect UI stuck in showing "Gateway has issues" ([#3594]) +- [UPDATE] Update MiniBolt community-applications-and-guides dev docs ([#3754]) + +[#3752]: https://github.com/nymtech/nym/issues/3752 +[#3741]: https://github.com/nymtech/nym/issues/3741 +[#3594]: https://github.com/nymtech/nym/issues/3594 +[#3754]: https://github.com/nymtech/nym/pull/3754 + ## [v1.1.24] (2023-08-08) - Latency based gateway selection is serial and slow ([#3710]) diff --git a/Cargo.lock b/Cargo.lock index 85ff104b27..dc35e48057 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1896,7 +1896,7 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "explorer-api" -version = "1.1.24" +version = "1.1.25" dependencies = [ "chrono", "clap 4.2.7", @@ -3530,7 +3530,7 @@ dependencies = [ [[package]] name = "nym-api" -version = "1.1.25" +version = "1.1.26" dependencies = [ "anyhow", "async-trait", @@ -3667,7 +3667,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.24" +version = "1.1.25" dependencies = [ "anyhow", "base64 0.13.1", @@ -3733,7 +3733,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.24" +version = "1.1.25" dependencies = [ "clap 4.2.7", "dirs 4.0.0", @@ -4021,7 +4021,7 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.24" +version = "1.1.25" dependencies = [ "anyhow", "async-trait", @@ -4176,7 +4176,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.25" +version = "1.1.26" dependencies = [ "anyhow", "bs58 0.4.0", @@ -4293,7 +4293,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.24" +version = "1.1.25" dependencies = [ "anyhow", "async-file-watcher", @@ -4340,7 +4340,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.24" +version = "1.1.25" dependencies = [ "dirs 4.0.0", "log", @@ -4497,7 +4497,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.24" +version = "1.1.25" dependencies = [ "clap 4.2.7", "lazy_static", diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 2135883752..e950db03ba 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.24" +version = "1.1.25" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index afbf36178f..3e22c2f148 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.24" +version = "1.1.25" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client.rs index 4a512a02db..9ca497e1c8 100644 --- a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client.rs +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client.rs @@ -28,6 +28,7 @@ use cosmrs::proto::cosmwasm::wasm::v1::{ }; use cosmrs::tendermint::{block, chain, Hash}; use cosmrs::{AccountId, Coin as CosmosCoin, Tx}; +use log::trace; use prost::Message; use serde::{Deserialize, Serialize}; use std::convert::TryFrom; @@ -69,6 +70,9 @@ pub trait CosmWasmClient: TendermintClient { Req: Message, Res: Message + Default, { + if let Some(ref abci_path) = path { + trace!("performing query on abci path {abci_path}") + } let mut buf = Vec::with_capacity(req.encoded_len()); req.encode(&mut buf)?; @@ -477,6 +481,7 @@ pub trait CosmWasmClient: TendermintClient { .make_abci_query::<_, QuerySmartContractStateResponse>(path, req) .await?; + trace!("raw query response: {}", String::from_utf8_lossy(&res.data)); Ok(serde_json::from_slice(&res.data)?) } diff --git a/common/cosmwasm-smart-contracts/coconut-bandwidth-contract/src/spend_credential.rs b/common/cosmwasm-smart-contracts/coconut-bandwidth-contract/src/spend_credential.rs index d8fc108d14..835d6175de 100644 --- a/common/cosmwasm-smart-contracts/coconut-bandwidth-contract/src/spend_credential.rs +++ b/common/cosmwasm-smart-contracts/coconut-bandwidth-contract/src/spend_credential.rs @@ -39,7 +39,9 @@ impl SpendCredentialData { #[cw_serde] #[derive(Copy)] pub enum SpendCredentialStatus { + #[serde(alias = "InProgress")] InProgress, + #[serde(alias = "Spent")] Spent, } diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs index cee4cf02be..6352c138c6 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs @@ -159,10 +159,12 @@ impl EpochStatus { pub enum EpochState { /// Represents the state of an epoch that's in progress (well, duh.) /// All actions are allowed to be issued. + #[serde(alias = "InProgress")] InProgress, /// Represents the state of an epoch when the rewarding entity has been decided on, /// and the mixnodes are in the process of being rewarded for their work in this epoch. + #[serde(alias = "Rewarding")] Rewarding { /// The id of the last node that has already received its rewards. last_rewarded: MixId, @@ -174,10 +176,12 @@ pub enum EpochState { /// Represents the state of an epoch when all mixnodes have already been rewarded for their work in this epoch /// and all issued actions should now get resolved before being allowed to advance into the next epoch. + #[serde(alias = "ReconcilingEvents")] ReconcilingEvents, /// Represents the state of an epoch when all mixnodes have already been rewarded for their work in this epoch, /// all issued actions got resolved and the epoch should now be advanced whilst assigning new rewarded set. + #[serde(alias = "AdvancingEpoch")] AdvancingEpoch, } diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/mixnode.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/mixnode.rs index 676098fce6..a09d21dd2d 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/mixnode.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/mixnode.rs @@ -26,9 +26,11 @@ use serde_repr::{Deserialize_repr, Serialize_repr}; #[derive(Copy)] pub enum RewardedSetNodeStatus { /// Node that is currently active, i.e. is expected to be used by clients for mixing packets. + #[serde(alias = "Active")] Active, /// Node that is currently in standby, i.e. it's present in the rewarded set but is not active. + #[serde(alias = "Standby")] Standby, } diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/pending_events.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/pending_events.rs index 595839c99f..fd681cbed4 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/pending_events.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/pending_events.rs @@ -37,6 +37,7 @@ pub enum PendingEpochEventKind { // `cumulative_reward_ratio` ahead of time /// Request to create a delegation towards particular mixnode. /// Note that if such delegation already exists, it will get updated with the provided token amount. + #[serde(alias = "Delegate")] Delegate { /// The address of the owner of the delegation. owner: Addr, @@ -53,6 +54,7 @@ pub enum PendingEpochEventKind { }, /// Request to remove delegation from particular mixnode. + #[serde(alias = "Undelegate")] Undelegate { /// The address of the owner of the delegation. owner: Addr, @@ -66,6 +68,7 @@ pub enum PendingEpochEventKind { }, /// Request to pledge more tokens (by the node operator) towards its node. + #[serde(alias = "PledgeMore")] PledgeMore { /// The id of the mixnode that will have its pledge updated. mix_id: MixId, @@ -75,6 +78,7 @@ pub enum PendingEpochEventKind { }, /// Request to decrease amount of pledged tokens (by the node operator) from its node. + #[serde(alias = "DecreasePledge")] DecreasePledge { /// The id of the mixnode that will have its pledge updated. mix_id: MixId, @@ -84,12 +88,14 @@ pub enum PendingEpochEventKind { }, /// Request to unbond a mixnode and completely remove it from the network. + #[serde(alias = "UnbondMixnode")] UnbondMixnode { /// The id of the mixnode that will get unbonded. mix_id: MixId, }, /// Request to update the current size of the active set. + #[serde(alias = "UpdateActiveSetSize")] UpdateActiveSetSize { /// The new desired size of the active set. new_size: u32, @@ -138,6 +144,7 @@ pub struct PendingIntervalEventData { #[cw_serde] pub enum PendingIntervalEventKind { /// Request to update cost parameters of given mixnode. + #[serde(alias = "PendingIntervalEventKind")] ChangeMixCostParams { /// The id of the mixnode that will have its cost parameters updated. mix_id: MixId, @@ -147,12 +154,14 @@ pub enum PendingIntervalEventKind { }, /// Request to update the underlying rewarding parameters used by the system + #[serde(alias = "UpdateRewardingParams")] UpdateRewardingParams { /// The detailed specification of the update. update: IntervalRewardingParamsUpdate, }, /// Request to change the next interval configuration. + #[serde(alias = "UpdateIntervalConfig")] UpdateIntervalConfig { /// The new number of epochs in intervals. epochs_in_interval: u32, diff --git a/common/cosmwasm-smart-contracts/vesting-contract/src/types.rs b/common/cosmwasm-smart-contracts/vesting-contract/src/types.rs index 60fd3c0aea..e4c1644a94 100644 --- a/common/cosmwasm-smart-contracts/vesting-contract/src/types.rs +++ b/common/cosmwasm-smart-contracts/vesting-contract/src/types.rs @@ -16,12 +16,15 @@ use std::str::FromStr; /// The vesting period. pub enum Period { /// Defines a pre-vesting period. + #[serde(alias = "Before")] Before, /// Defines currently active vesting period. + #[serde(alias = "In")] In(usize), /// Defines a post-vesting period. + #[serde(alias = "After")] After, } @@ -53,9 +56,11 @@ impl PledgeData { #[cw_serde] pub enum PledgeCap { /// Specifies a percent-based pledge cap, i.e. only given % of tokens could be pledged/staked. + #[serde(alias = "Percent")] Percent(Percent), /// Specifies an absolute pledge cap, i.e. an explicit value that could be pledged/staked. + #[serde(alias = "Absolute")] Absolute(Uint128), // This has to be in unym } diff --git a/contracts/CHANGELOG.md b/contracts/CHANGELOG.md index ffa2dba525..dbad30e829 100644 --- a/contracts/CHANGELOG.md +++ b/contracts/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## Unreleased +## [Unreleased] + +## [v1.5.0] (2023-08-16) +- Generate json schema for all used contracts #3693 ([#3693]) + +[#3233]: https://github.com/nymtech/nym/pull/3693 + ## [v1.4.0] (2023-04-25) - Allow mixnode operators to decrease their bond amount without having to rebond (will require a lot of testing EXACT reward values to make sure the "unit delegation" isn't broken afterwards) ([#3233]) diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 0f56b6f7a9..a790f12047 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -290,12 +290,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-bigint" version = "0.4.9" @@ -1278,7 +1272,7 @@ dependencies = [ [[package]] name = "nym-mixnet-contract" -version = "1.4.0" +version = "1.5.0" dependencies = [ "bs58", "cosmwasm-derive", @@ -1426,7 +1420,7 @@ dependencies = [ [[package]] name = "nym-vesting-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64 0.21.0", "cosmwasm-crypto", diff --git a/contracts/mixnet/Cargo.toml b/contracts/mixnet/Cargo.toml index 999ef93c8b..a50d9c789a 100644 --- a/contracts/mixnet/Cargo.toml +++ b/contracts/mixnet/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-mixnet-contract" -version = "1.4.0" +version = "1.5.0" description = "Nym mixnet contract" edition = { workspace = true } authors = { workspace = true } diff --git a/contracts/mixnet/schema/nym-mixnet-contract.json b/contracts/mixnet/schema/nym-mixnet-contract.json index 22cf2a118d..37cbc9ba65 100644 --- a/contracts/mixnet/schema/nym-mixnet-contract.json +++ b/contracts/mixnet/schema/nym-mixnet-contract.json @@ -1,6 +1,6 @@ { "contract_name": "nym-mixnet-contract", - "contract_version": "1.4.0", + "contract_version": "1.5.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/vesting/Cargo.toml b/contracts/vesting/Cargo.toml index 5998e5d773..053aeedd15 100644 --- a/contracts/vesting/Cargo.toml +++ b/contracts/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-vesting-contract" -version = "1.4.0" +version = "1.4.1" description = "Nym vesting contract" edition = { workspace = true } authors = { workspace = true } diff --git a/contracts/vesting/schema/nym-vesting-contract.json b/contracts/vesting/schema/nym-vesting-contract.json index 87967fb410..6dd3678fd3 100644 --- a/contracts/vesting/schema/nym-vesting-contract.json +++ b/contracts/vesting/schema/nym-vesting-contract.json @@ -1,6 +1,6 @@ { "contract_name": "nym-vesting-contract", - "contract_version": "1.4.0", + "contract_version": "1.4.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 04e7255d01..df5f0cf1b5 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.24" +version = "1.1.25" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 007fcca40d..589c65ec8f 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.24" +version = "1.1.25" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs index cc8c552b07..e19f4a14fe 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs @@ -118,8 +118,15 @@ impl CoconutVerifier { revoke_fee.clone(), ) .await?; - if !ret?.verification_result { - debug!("Validator {} didn't accept the credential. It will probably vote No on the spending proposal", client.api_client.nym_api_client.current_url()); + match ret { + Ok(res) => { + if !res.verification_result { + debug!("Validator {} didn't accept the credential. It will probably vote No on the spending proposal", client.api_client.nym_api_client.current_url()); + } + } + Err(e) => { + warn!("Validator {} could not be reached. There might be a problem with the coconut endpoint - {:?}", client.api_client.nym_api_client.current_url(), e); + } } } diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 8421bebb3a..a670dd4f81 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.25" +version = "1.1.26" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 50568b440a..758e190be0 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.25" +version = "1.1.26" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/tests/package-lock.json b/nym-api/tests/package-lock.json index 020a0426be..f08dccfcf4 100644 --- a/nym-api/tests/package-lock.json +++ b/nym-api/tests/package-lock.json @@ -103,9 +103,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -158,9 +158,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2883,9 +2883,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3653,9 +3653,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4273,9 +4273,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4918,9 +4918,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -4962,9 +4962,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -6970,9 +6970,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -7559,9 +7559,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -7984,9 +7984,9 @@ "dev": true }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" diff --git a/nym-api/tests/yarn.lock b/nym-api/tests/yarn.lock index 9e5476cf80..4fc3d5aa56 100644 --- a/nym-api/tests/yarn.lock +++ b/nym-api/tests/yarn.lock @@ -2566,16 +2566,16 @@ safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + 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" semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== shebang-command@^2.0.0: version "2.0.0" diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index 8a0b86151a..13f449269e 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +## [1.1.27] (2023-08-16) + +- Add a "Send us your feedback" section in NC (on the main screen) to collect user feedback using Sentry ([#3619]) +- NC native android - deploy on FDroid ([#3483]) + +[#3619]: https://github.com/nymtech/nym/issues/3619 +[#3483]: https://github.com/nymtech/nym/issues/3483 + ## [v1.1.16] (2023-08-08) - Uncouple network-requester <-> gateway in nym-connect and harbourmaster ([#3472]) diff --git a/nym-connect/desktop/package.json b/nym-connect/desktop/package.json index 96d9e83438..30612c08fe 100644 --- a/nym-connect/desktop/package.json +++ b/nym-connect/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.16", + "version": "1.1.17", "main": "index.js", "license": "MIT", "scripts": { @@ -47,7 +47,7 @@ "react-markdown": "^8.0.4", "react-router-dom": "^6.7.0", "semver": "^6.3.0", - "yup": "^0.32.9" + "yup": "^1.2.0" }, "devDependencies": { "@babel/core": "^7.15.0", diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 0d1089132d..65c0315bc8 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.16" +version = "1.1.17" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/desktop/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json index 5f5e86bec0..c015cf383c 100644 --- a/nym-connect/desktop/src-tauri/tauri.conf.json +++ b/nym-connect/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.16" + "version": "1.1.17" }, "build": { "distDir": "../dist", diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 46d3312fac..ba6377e90b 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -33,6 +33,7 @@ export type TClientContext = { userDefinedSPAddress: UserDefinedSPAddress; serviceProviders?: ServiceProvider[]; gateways?: Gateway[]; + showFeedbackNote: boolean; setMode: (mode: ModeType) => void; clearError: () => void; setConnectionStatus: (connectionStatus: ConnectionStatusKind) => void; @@ -47,6 +48,7 @@ export type TClientContext = { setUserDefinedSPAddress: React.Dispatch>; setMonitoring: (value: boolean) => Promise; setPrivacyLevel: (value: PrivacyLevel) => Promise; + setShowFeedbackNote: (value: boolean) => void; }; function getRandomFromList(items: T[]): T { @@ -77,6 +79,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { address: undefined, }); const [userData, setUserData] = useState(); + const [showFeedbackNote, setShowFeedbackNote] = useState(true); const getAppVersion = async () => { const version = await getVersion(); @@ -161,9 +164,15 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { } }, []); + const afterDisconnection = useCallback(async () => { + setGatewayPerformance('Good'); + setConnectedSince(undefined); + }, []); + const startDisconnecting = useCallback(async () => { try { await invoke('start_disconnecting'); + afterDisconnection(); } catch (e) { console.log(e); Sentry.captureException(e); @@ -240,6 +249,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { serviceProviders, connectedSince, userData, + showFeedbackNote, setConnectedSince, setServiceProvider, setGateway, @@ -253,6 +263,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { setUserDefinedSPAddress, setMonitoring, setPrivacyLevel, + setShowFeedbackNote, }), [ mode, @@ -270,6 +281,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { userDefinedGateway, userDefinedSPAddress, userData, + showFeedbackNote, ], ); diff --git a/nym-connect/desktop/src/context/mocks/main.tsx b/nym-connect/desktop/src/context/mocks/main.tsx index 46a5f50298..0b6db34aaf 100644 --- a/nym-connect/desktop/src/context/mocks/main.tsx +++ b/nym-connect/desktop/src/context/mocks/main.tsx @@ -12,6 +12,7 @@ const mockValues: TClientContext = { userDefinedGateway: { isActive: false, gateway: '' }, userDefinedSPAddress: { isActive: false, address: '' }, userData: { monitoring: false, privacy_level: 'High' }, + showFeedbackNote: false, setShowInfoModal: () => {}, setMode: () => {}, clearError: () => {}, @@ -26,6 +27,7 @@ const mockValues: TClientContext = { setUserDefinedSPAddress: () => {}, setMonitoring: async () => {}, setPrivacyLevel: async () => {}, + setShowFeedbackNote: () => {}, }; export const MockProvider: FCWithChildren<{ diff --git a/nym-connect/desktop/src/pages/connection/Disconnected.tsx b/nym-connect/desktop/src/pages/connection/Disconnected.tsx index 127a245d4e..00e51b9221 100644 --- a/nym-connect/desktop/src/pages/connection/Disconnected.tsx +++ b/nym-connect/desktop/src/pages/connection/Disconnected.tsx @@ -1,5 +1,6 @@ import React from 'react'; -import { Stack, Typography } from '@mui/material'; +import { Alert, Link, Stack, Typography } from '@mui/material'; +import { Link as RouterLink } from 'react-router-dom'; import { ConnectionStatus } from 'src/components/ConnectionStatus'; import { ConnectionTimer } from 'src/components/ConntectionTimer'; import { InfoModal } from 'src/components/InfoModal'; @@ -10,6 +11,7 @@ import { ConnectionStatusKind } from 'src/types'; import { PowerButton } from 'src/components/PowerButton/PowerButton'; import { Box } from '@mui/system'; import { ConnectionLayout } from 'src/layouts/ConnectionLayout'; +import { useClientContext } from '../../context/main'; export const Disconnected: FCWithChildren<{ error?: Error; @@ -20,32 +22,53 @@ export const Disconnected: FCWithChildren<{ serviceProvider?: ServiceProvider; clearError: () => void; onConnectClick: (status: ConnectionStatusKind) => void; -}> = ({ status, error, onConnectClick, clearError }) => ( - <> - {error && } - - - - - } - ConnectButton={} - BottomContent={ - - - You are not protected - - - - } - /> - -); +}> = ({ status, error, onConnectClick, clearError }) => { + const { showFeedbackNote, setShowFeedbackNote } = useClientContext(); + + return ( + <> + {error && } + + + + + } + ConnectButton={} + BottomContent={ + + + You are not protected + + + {showFeedbackNote ? ( + setShowFeedbackNote(false)}> + Help improve NymConnect +
+ setShowFeedbackNote(false)} + component={RouterLink} + color="secondary" + underline="hover" + > + Send feedback + +
+ ) : ( + + )} +
+ } + /> + + ); +}; diff --git a/nym-connect/desktop/src/pages/menu/settings/PrivacyLevelSettings.tsx b/nym-connect/desktop/src/pages/menu/PrivacyLevelSettings.tsx similarity index 96% rename from nym-connect/desktop/src/pages/menu/settings/PrivacyLevelSettings.tsx rename to nym-connect/desktop/src/pages/menu/PrivacyLevelSettings.tsx index a97e7fdfdf..9935ef8f4c 100644 --- a/nym-connect/desktop/src/pages/menu/settings/PrivacyLevelSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/PrivacyLevelSettings.tsx @@ -1,7 +1,7 @@ import React, { ChangeEvent, useState } from 'react'; import * as Sentry from '@sentry/react'; import { Box, FormControl, FormControlLabel, FormHelperText, Stack, Switch, Typography } from '@mui/material'; -import { useClientContext } from 'src/context/main'; +import { useClientContext } from '../../context/main'; export const PrivacyLevelSettings = () => { const { userData, setPrivacyLevel } = useClientContext(); diff --git a/nym-connect/desktop/src/pages/menu/index.tsx b/nym-connect/desktop/src/pages/menu/index.tsx index 67576dc88c..285d368061 100644 --- a/nym-connect/desktop/src/pages/menu/index.tsx +++ b/nym-connect/desktop/src/pages/menu/index.tsx @@ -8,8 +8,8 @@ const menuSchema = [ { title: 'Supported apps', icon: Apps, path: 'apps' }, { title: 'How to connect guide', icon: HelpOutline, path: 'guide' }, { title: 'Privacy level', icon: PrivacyTip, path: 'privacy-level' }, - { title: 'Please help us improve the app', icon: BugReport, path: 'monitoring' }, { title: 'Settings', icon: Settings, path: 'settings' }, + { title: 'Help improve the app', icon: BugReport, path: 'reporting' }, ]; export const Menu = () => ( diff --git a/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx b/nym-connect/desktop/src/pages/menu/reporting/ErrorReporting.tsx similarity index 62% rename from nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx rename to nym-connect/desktop/src/pages/menu/reporting/ErrorReporting.tsx index 8b899cbe72..baf465944c 100644 --- a/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/reporting/ErrorReporting.tsx @@ -1,9 +1,8 @@ import React, { ChangeEvent, useState } from 'react'; -import { Warning as WarningIcon } from '@mui/icons-material'; import { Box, FormControl, FormControlLabel, FormHelperText, Stack, Switch, Typography } from '@mui/material'; -import { useClientContext } from 'src/context/main'; +import { useClientContext } from '../../../context/main'; -export const MonitoringSettings = () => { +export const ErrorReporting = () => { const { userData, setMonitoring } = useClientContext(); const [enabled, setEnabled] = useState(userData?.monitoring || false); const [loading, setLoading] = useState(false); @@ -20,7 +19,7 @@ export const MonitoringSettings = () => { - Error reporting and performance monitoring + Turn on error reporting and performance monitoring { sx={{ ml: 1, mr: 1 }} /> } - label="Enable" + label={enabled ? 'On' : 'Off'} /> - Help Nym developers to fix errors, crashes and improve the application by enabling this option. If errors - occur or if the app crashes, it will automatically send a report. Also it tracks various performance - metrics. We use sentry.io service to handle this. + Help Nym developers fix errors, crashes and improve the application by enabling this option. If errors + occur or if the app crashes, it will automatically send a report. It also tracks various performance + metrics. We use Sentry.io service to handle this. - - - - You must restart the application for the change to take effect. - - + + You must restart the application for the change to take effect. + diff --git a/nym-connect/desktop/src/pages/menu/reporting/UserFeedback.tsx b/nym-connect/desktop/src/pages/menu/reporting/UserFeedback.tsx new file mode 100644 index 0000000000..67b37fcc5f --- /dev/null +++ b/nym-connect/desktop/src/pages/menu/reporting/UserFeedback.tsx @@ -0,0 +1,124 @@ +import React, { useState } from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import { Alert, Box, Button, FormControl, Link, Snackbar, Stack, TextField, Typography } from '@mui/material'; +import * as Sentry from '@sentry/react'; +import { Controller, SubmitHandler, useForm } from 'react-hook-form'; +import { object, string } from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useClientContext } from '../../../context/main'; + +type FormValues = { + email?: string; + feedback: string; +}; + +const schema = object({ + email: string().email(), + feedback: string().required().min(20).max(512), +}).required(); + +export const UserFeedback = () => { + const [isBusy, setIsBusy] = useState(false); + const { userData } = useClientContext(); + + const { + handleSubmit, + control, + formState: { errors }, + reset, + } = useForm({ + defaultValues: { + email: '', + feedback: '', + }, + // inferred type is fucked, so use `any` to make TS happy + resolver: yupResolver(schema as any), + }); + + const onSubmit: SubmitHandler = (data) => { + const eventId = Sentry.captureMessage('user feedback'); + Sentry.captureUserFeedback({ + event_id: eventId, + name: 'nym', + email: data.email, + comments: data.feedback, + }); + setIsBusy(true); + reset(); + }; + + const handleClose = () => { + setIsBusy(false); + }; + + if (!userData?.monitoring) { + return ( + + + The error reporting option must be enabled in order to report feedback. Turn it on{' '} + + here + + . + + + ); + } + + return ( + + + + Feedback sent successfuly + + + + + + Send us your feedback about the app + +
+ + ( + + )} + name="email" + control={control} + /> + + + ( + + )} + name="feedback" + control={control} + /> + + + + +
+
+
+
+ ); +}; diff --git a/nym-connect/desktop/src/pages/menu/reporting/index.tsx b/nym-connect/desktop/src/pages/menu/reporting/index.tsx new file mode 100644 index 0000000000..ccc2c0bd1f --- /dev/null +++ b/nym-connect/desktop/src/pages/menu/reporting/index.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import { Link, List, ListItem, ListItemButton, ListItemText, Stack } from '@mui/material'; +import { AppVersion } from 'src/components/AppVersion'; + +const menuSchema = [ + { title: 'Turn on error reporting', path: 'error-reporting' }, + { title: 'Send us your feedback', path: 'user-feedback' }, +]; + +export const ReportingMenu = () => ( + + + {menuSchema.map((item) => ( + + + + {item.title} + + + + ))} + + + +); diff --git a/nym-connect/desktop/src/routes/index.tsx b/nym-connect/desktop/src/routes/index.tsx index f1e4b1da67..67bd471460 100644 --- a/nym-connect/desktop/src/routes/index.tsx +++ b/nym-connect/desktop/src/routes/index.tsx @@ -8,9 +8,11 @@ import { HelpGuide } from 'src/pages/menu/Guide'; import { SettingsMenu } from 'src/pages/menu/settings'; import { GatewaySettings } from 'src/pages/menu/settings/GatewaySettings'; import { ServiceProviderSettings } from 'src/pages/menu/settings/ServiceProviderSettings'; -import { MonitoringSettings } from '../pages/menu/settings/MonitoringSettings'; -import { PrivacyLevelSettings } from '../pages/menu/settings/PrivacyLevelSettings'; +import { ErrorReporting } from '../pages/menu/reporting/ErrorReporting'; +import { PrivacyLevelSettings } from '../pages/menu/PrivacyLevelSettings'; import { useClientContext } from '../context/main'; +import { ReportingMenu } from '../pages/menu/reporting'; +import { UserFeedback } from '../pages/menu/reporting/UserFeedback'; const SentryRoutes = Sentry.withSentryReactRouterV6Routing(Routes); @@ -27,12 +29,16 @@ export const AppRoutes = () => { } /> } /> } /> - } /> } /> } /> } /> + + } /> + } /> + } /> + ); diff --git a/nym-connect/mobile/src/context/main.tsx b/nym-connect/mobile/src/context/main.tsx index b999b957a2..10f6525685 100644 --- a/nym-connect/mobile/src/context/main.tsx +++ b/nym-connect/mobile/src/context/main.tsx @@ -116,9 +116,15 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { } }, []); + const afterDisconnection = useCallback(async () => { + setGatewayPerformance('Good'); + setConnectedSince(undefined); + }, []); + const startDisconnecting = useCallback(async () => { try { await invoke('start_disconnecting'); + afterDisconnection(); } catch (e) { console.log(e); } diff --git a/package.json b/package.json index 523db5363f..a18fc8c35a 100644 --- a/package.json +++ b/package.json @@ -37,4 +37,4 @@ "lerna": "^6.6.2", "npm-run-all": "^4.1.5" } -} +} \ No newline at end of file diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index d1d7367d85..a7b2f416c6 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.24" +version = "1.1.25" authors.workspace = true edition.workspace = true rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 7c0138ca8f..8c5d7784f0 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.24" +version = "1.1.25" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index 9f3c0d6a2a..a693b9aa12 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.24" +version = "1.1.25" authors.workspace = true edition = "2021" diff --git a/yarn.lock b/yarn.lock index 178152e2f1..10f93b7eaf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17413,7 +17413,7 @@ prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, object-assign "^4.1.1" react-is "^16.13.1" -property-expr@^2.0.4: +property-expr@^2.0.4, property-expr@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== @@ -20018,6 +20018,11 @@ timers-ext@^0.1.7: es5-ext "~0.10.46" next-tick "1" +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" @@ -21786,6 +21791,16 @@ yup@^0.32.9: property-expr "^2.0.4" toposort "^2.0.2" +yup@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.2.0.tgz#9e51af0c63bdfc9be0fdc6c10aa0710899d8aff6" + integrity sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" + zod@^3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"